pkg-config 是 Linux/Unix 下用于自动获取库编译(-I)、链接(-L/-l)参数及版本信息的元数据查询工具,解决手动指定路径和依赖的繁琐问题;它通过读取.pc文件实现跨平台构建自动化。

pkg-config 是什么,它解决什么问题
它不是 C++ 语言的一部分,而是一个 Linux 下的元信息查询工具,用来帮你自动获取某个库的编译参数(-I 头文件路径)、链接参数(-L 库路径、-l 库名)和版本信息。你写 g++ main.cpp `pkg-config --cflags --libs opencv4` 能跑通,靠的就是它把一堆手动拼凑的路径和标志替换成现成结果。
怎么查一个库是否可用、支持哪些 flag
先确认库的 .pc 文件已安装且在 PKG_CONFIG_PATH 路径下。常见位置是 /usr/lib/pkgconfig 或 /usr/local/lib/pkgconfig。运行以下命令验证:
pkg-config --list-all | grep -i opencv
如果看到 opencv4 或 opencv,说明可用。再查具体信息:
-
pkg-config --cflags opencv4:输出头文件搜索路径,如-I/usr/include/opencv4 -
pkg-config --libs opencv4:输出链接参数,如-L/usr/lib/x86_64-linux-gnu -lopencv_core -lopencv_imgproc -
pkg-config --modversion opencv4:输出版本号,比如4.5.5
注意:--cflags 和 --libs 必须分开调用,合在一起用 `pkg-config --cflags --libs xxx` 是 shell 反引号展开语法,不是 pkg-config 自身支持的“单命令”。
立即学习“C++免费学习笔记(深入)”;
在 Makefile 里安全使用 pkg-config
直接写反引号容易出错(比如空格、换行),推荐用 $(shell ...) 并加括号包裹:
CPPFLAGS := $(shell pkg-config --cflags opencv4) LDFLAGS := $(shell pkg-config --libs opencv4)
更健壮的做法是加存在性检查:
- 用
pkg-config --exists opencv4判断库是否存在,失败时make报错退出 - 避免硬编码库名,用变量如
PKG_LIBS = opencv4,方便切换不同版本 - 不要把
--cflags和--libs拼进同一个变量,C++ 编译器不认链接选项,链接器不认头文件选项
典型错误是写成 CXXFLAGS += `pkg-config --cflags --libs opencv4`,导致 -lopencv_core 被传给编译器而非链接器,报 undefined reference。
找不到 .pc 文件?常见原因和修复方式
最常遇到的是安装了库但没装开发包(devel package)。例如 Ubuntu 上装了 libopencv-dev 才有 opencv4.pc;CentOS/RHEL 需要 opencv-devel。另一个原因是自定义安装路径未加入环境变量:
- 检查
pkg-config --variable pc_path pkg-config输出的路径列表 - 若你的
.pc在/opt/opencv/lib/pkgconfig,就执行export PKG_CONFIG_PATH="/opt/opencv/lib/pkgconfig:$PKG_CONFIG_PATH" - 临时测试可用
PKG_CONFIG_PATH=/path/to/pc pkg-config --modversion opencv4
别依赖 LD_LIBRARY_PATH 来让 pkg-config 找到 .pc 文件——它只看 PKG_CONFIG_PATH,和动态库加载路径无关。
真正麻烦的是多个同名库共存(比如系统自带 opencv3 和手动编译的 opencv4),此时 pkg-config 默认选第一个匹配项,得靠 PKG_CONFIG_PATH 顺序或重命名 .pc 文件来控制优先级。这点容易被忽略,直到链接时符号冲突或版本错乱才暴露出来。


















