macos 原生不带 pkg-config,需用 homebrew 安装并手动配置 pkg_config_path 以支持查找库;对无 .pc 文件的库(如 openssl@3)可临时生成;cmake 中应优先使用 find_package 而非混用 pkg_check_modules;header-only 库、系统框架及跨平台项目不宜依赖 pkg-config。

pkg-config 在 macOS 上是否默认可用
macOS 原生不带 pkg-config,直接运行会报 command not found。Homebrew 安装的库(如 openssl、libpng)通常也不自带 .pc 文件,即使你用 brew install pkg-config 装上了命令,也大概率查不到依赖信息。
常见错误现象:pkg-config --modversion openssl 返回空或报错 Package openssl was not found,但 brew --prefix openssl 明明能拿到路径。
- Homebrew 从 3.0+ 开始默认不自动链接
.pc文件,需手动处理 -
pkg-config默认只查/usr/lib/pkgconfig、/usr/local/lib/pkgconfig和PKG_CONFIG_PATH中的路径,Homebrew 的.pc文件实际在$(brew --prefix)/lib/pkgconfig - 某些库(如
boost)压根不提供.pc文件,不能硬套pkg-config
让 pkg-config 找到 Homebrew 安装的库
核心是把 Homebrew 的 lib/pkgconfig 目录加进搜索路径,并确保对应库已生成或提供 .pc 文件。
实操建议:
- 运行
export PKG_CONFIG_PATH="$(brew --prefix)/lib/pkgconfig:$PKG_CONFIG_PATH"(建议写入~/.zshrc) - 对没有
.pc文件的库(如openssl@3),可临时生成一个:echo 'prefix=$(brew --prefix openssl@3) exec_prefix=${prefix} libdir=${prefix}/lib includedir=${prefix}/include Name: OpenSSL Description: OpenSSL library Version: $(openssl version | cut -d" " -f2) Libs: -L${libdir} -lssl -lcrypto Cflags: -I${includedir}' > $(brew --prefix openssl@3)/lib/pkgconfig/openssl.pc - 验证:运行
pkg-config --cflags --libs openssl,应输出类似-I/opt/homebrew/include -L/opt/homebrew/lib -lssl -lcrypto
CMake 中正确使用 pkg-config 查找依赖
CMake 自带 find_package(),但和 pkg-config 是两套机制。混用容易出问题——比如 find_package(OpenSSL) 成功了,但你又在 target_link_libraries() 里写 pkg_check_modules(),可能链接重复或路径冲突。
推荐做法(仅当必须用 pkg-config 时):
- 用
find_package(PkgConfig REQUIRED)启用支持 - 用
pkg_check_modules(OPENSSL REQUIRED IMPORTED_TARGET openssl),它会创建PkgConfig::openssl导入目标 - 然后
target_link_libraries(myapp PRIVATE PkgConfig::openssl),避免手动拼接-I/-L - 注意:
IMPORTED_TARGET是关键,否则pkg_check_modules只设变量(如OPENSSL_LIBRARIES),易漏CFLAGS或静态链接问题
什么时候不该用 pkg-config
不是所有 C++ 依赖都适合走 pkg-config 流程。它本质是为 C 库设计的元数据机制,对现代 C++ 项目有明显局限:
-
boost、fmt、range-v3等 header-only 库不需要链接,但pkg-config强绑定Libs:字段,强行用反而增加维护成本 - CMake 的
FetchContent或find_package(... CONFIG)(如find_package(fmt CONFIG))更可靠,能精确控制版本和构建选项 - macOS 上系统库(如
CoreFoundation、Security)没有.pc文件,必须用find_library()或target_link_libraries(... "-framework Security") - 跨平台项目若只依赖
pkg-config,Windows 下基本跑不通,除非额外引入pkgconf工具链
真正需要它的场景其实很窄:对接大量已有 Autotools/Makefile 项目的遗留 C 库,或者 CI 中复用 Linux 发行版的 .pc 生态。日常开发中,优先走 CMake 原生方案更省心。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










