简介
pkg-config是编译应用程序和库时使用的辅助工具。它可以帮助我们在命令行中插入正确的编译器选项,以便应用程序可以使用诸如gcc -o test test.c `pkg-config --libs --cflags glibc-2.29`
的命令,其中–cflags和–libs分别指定CFLAGS参数和库文件。这样我们就不必通过硬编码来找到glib(或其他库)。它与语言无关,因此可用于定义文档的位置。
详解
那么pc-config是从哪儿知道这些信息的呢?它是从名为xxx.pc这个文件中查找到的。上面的例子中,它是从glibc-2.29.pc文件中查知的。
那pkg-config 又怎么会知道opencv.pc这个文件呢?
- 默认情况下,pkg-config首先在prefix/lib/pkgconfig/中查找相关包对应的相应的文件。在linux上上述路径名为 /usr/lib/pkgconfig/。
- 若是没有找到,它也会到PKG_CONFIG_PATH这个环境变量所指定的路径下去找。若是没有找到,它就会报错。
设置环境变量PKG_CONFIG_PATH的方法为:
export PKG_CONFIG_PATH=/your/pathname:$PKG_CONFIG_PATH
如果想要让该环境变量永久生效,可以在/etc/profile文件中添加上面的语句,然后执行source /etc/profile
让其立即生效。
编写pc文件
这里通过一个示例讲解一下如何编写pc文件。pc文件只需5个内容:Name、Description、Version、Cflags、Libs。当然,为了书写方便,我们一般还会加入一些变量。
在/usr/lib/pkgconfig中添加文件glibc-2.29.pc,并加入以下内容:
prefix=/usr/local/glibc-2.29
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${exec_prefix}/include
Name: GLibc
Description: C Utility Library
Version: 2.29
Libs: -L${libdir} -lm
Cflags: -I${includedir}
- prefix一般是指定库的默认安装路径
- exec_prefix一般是指库的另外指定的安装路径
- inludedir指定库的头文件路径
- libdir指定库的lib文件的路径
- Name指定库的名称
- Description表示库的描述
- Version是版本号
- Cflags是gcc链接头文件的指令
- Libs是gcc链接lib文件的指令
在命令行中运行pkg-config --libs --cflags glibc-2.29
,我们会得到
-I/usr/local/glibc-2.29/include -L/usr/local/glibc-2.29/lib -lm
可见,pkg-config只是对gcc的一些参数进行封装而已
补充知识
这里介绍一个相关的宏,PKG_CHECK_MODULES。我们可以在configure.ac中使用宏PKG_CHECK_MODULES进行检查模块是否存在。典型用法是:
PKG_CHECK_MODULES([MYSTUFF],[gtk + -2.0> = 1.3.5 libxml = 1.8.4])