能否让CMake执行find_package()时自动调用pkg-config查找依赖包?
解决CMake find_package() 自动 fallback 到 pkg-config 的命令行方案
CMake 目前还没实现「find_package() 找不到对应.cmake脚本时自动用pkg-config查找」的功能(该需求已列为CMake Gitlab issue 26845),不过可以通过以下命令行方式绕开,不用修改每个项目的CMakeLists.txt:
全局生效的临时方案
调用cmake时直接传入以下参数,让所有find_package操作优先尝试pkg-config:
cmake -S . -B build -DCMAKE_FIND_PACKAGE_USE_PKG_CONFIG=ON -DCMAKE_FIND_PACKAGE_PREFER_CONFIG=OFF
CMAKE_FIND_PACKAGE_USE_PKG_CONFIG=ON:强制CMake在查找包时启用pkg-config支持CMAKE_FIND_PACKAGE_PREFER_CONFIG=OFF:关闭「优先查找config模式.cmake脚本」的默认行为,避免因为找不到脚本直接失败
如果你的系统里pkg-config模块路径不在默认CMake搜索路径里,还需要加上CMAKE_MODULE_PATH指定路径,比如:
cmake -S . -B build -DCMAKE_MODULE_PATH="/usr/share/cmake/Modules" -DCMAKE_FIND_PACKAGE_USE_PKG_CONFIG=ON -DCMAKE_FIND_PACKAGE_PREFER_CONFIG=OFF
针对单个依赖的精准方案
如果只想给某个特定依赖启用pkg-config查找,直接通过命令行注入该依赖的查找结果变量即可:
cmake -S . -B build \ -D<依赖名>_FOUND=ON \ -D<依赖名>_INCLUDE_DIRS="$(pkg-config --cflags-only-I <依赖名> | sed 's/-I//g')" \ -D<依赖名>_LIBRARIES="$(pkg-config --libs <依赖名>)"
举个例子,假设依赖是libcurl,命令就改成:
cmake -S . -B build \ -Dlibcurl_FOUND=ON \ -Dlibcurl_INCLUDE_DIRS="$(pkg-config --cflags-only-I libcurl | sed 's/-I//g')" \ -Dlibcurl_LIBRARIES="$(pkg-config --libs libcurl)"
这样CMake执行find_package时会直接认定该依赖已找到,使用你传入的编译、链接参数。
持久化配置(可选)
不想每次敲长命令的话,可以把全局配置变量加到shell配置文件里,比如~/.bashrc或~/.zshrc:
export CMAKE_FIND_PACKAGE_USE_PKG_CONFIG=ON export CMAKE_FIND_PACKAGE_PREFER_CONFIG=OFF
之后每次调用cmake都会自动套用这些设置。
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

