pkgconfig
pkg-config 介绍
pkg-config 是一个在编译 C/C++ 等程序时用于查询库的信息的工具。它能帮助开发者获取以下内容:
- 库的编译器参数(例如头文件的路径)。
- 链接器参数(例如要链接的
.so或.a文件)。 - 版本号等元信息。
其主要作用是简化构建过程中的依赖管理。
pkg-config 的实际应用优势
假设我们要使用 glib - 2.0 这个库,按照传统做法,编译命令如下:
gcc -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lglib-2.0 mycode.c -o myapp
然而,这些路径可能会因不同的系统而有所差异,这就给开发者带来了极大的不便。
当使用 pkg-config 后,编译命令可以简化为:
gcc mycode.c $(pkg-config --cflags --libs glib-2.0) -o myapp
这样,系统会自动为我们填入正确的 -I 和 -l 参数,大大提高了开发效率。
pkg-config 的工作原理
pkg-config 基于 .pc 文件(即 package config 文件)来工作。这些 .pc 文件一般位于以下路径:
/usr/lib/pkgconfig//usr/lib/x86_64-linux-gnu/pkgconfig//usr/local/lib/pkgconfig//usr/local/lib64/pkgconfig/- 环境变量指定的路径中(例如
PKG_CONFIG_PATH)
下面是一个 .pc 文件的示例(glib - 2.0.pc):
prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Name: GLib
Description: C Utility Library
Version: 2.56.4
Libs: -L${libdir} -lglib-2.0
Cflags: -I${includedir}/glib-2.0 -I${libdir}/glib-2.0/include
当我们运行以下命令时:
pkg-config --cflags glib-2.0
pkg-config 会解析 Cflags: 这一行,然后返回:
-I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include
而运行:
pkg-config --libs glib-2.0
则会返回:
-L/usr/lib -lglib-2.0
pkg-config 常用命令
pkg-config --cflags <lib> # 获取编译参数
pkg-config --libs <lib> # 获取链接参数
pkg-config --modversion <lib> # 获取库的版本
pkg-config --list-all # 列出所有已知的库
使用 pkg-config 的注意事项
- .pc 文件的来源:
.pc文件通常由库的开发者或包管理器提供。 - 部分库未默认安装 .pc 文件:有些库不会默认安装
.pc文件,但大多数库会安装。我们可以在install日志中搜索.pc来确认。 - 新安装库未列出的问题:如果刚安装的库执行
pkg-config --list-all没有列出来,需要确认安装目录是否包含在PKG_CONFIG_PATH中,若没有则添加进去。 - 交叉编译或自定义安装路径:在进行交叉编译或使用自定义安装路径时,需要设置
PKG_CONFIG_PATH环境变量,示例如下:
export PKG_CONFIG_PATH=/custom/lib/pkgconfig
而通常在编译前的./configure阶段,configure脚本就会去读取PKG_CONFIG_PATH路径下的.pc文件,用于指定库的头文件与库函数路径。
浙公网安备 33010602011771号