本文是转载自简书pkg-config用法详解,并根据自己的环境修改。
背景
当开发过程中使用第三方库时,我们需要知道被使用的第三方库,它包含的头文件在哪儿、它依赖哪些库、它的编译选项有哪些、它的链接选项有哪些等等,也就是说需要知道这些信息我们才能正确的编译和链接它。当然可以通过直接在编译选项中指定的方式来使用,但是,对于一些大型或者比较复杂的第三方库,包含的头文件或者依赖库非常多、非常复杂的时候,这样做的成本就非常高,而且非常不便于在不同平台之间的移植。
pkg-config
就是解决这个问题的一种方案。
pkg-config
是什么
pkg-config
是一个用于获取系统中安装的包/库的相关信息(例如依赖头文件目录、依赖库文件目录)的程序,通常用于编译和链接一个或多个库,典型的用法为:
1 | # Makefile |
注意符号 `,不是引号,而是重音符
pkg-config
通过读取一个名为 <PackageName>.pc
的文件来获取 <PackageName>
包的信息,一般会从 /usr/lib/pkgconfig
, /usr/share/pkgconfig
, /usr/local/lib/pkgconfig
, /usr/local/share/pkgconfig
来查找 .pc
文件,除此之外,也可通过设置 PKG_CONFIG_PATH
环境变量指定查找路径。
编写一个自己的库
Linux 或 macOS 系统可以通过 man pkg-config
来查看pkg-config
的用法,选项有很多,此处不一一介绍,最常用到的两个选项是 pkg-config --cflags <PackageName>
和 pkg-config --libs <PackageName>
,其含义分别为:
--cflags
:获取编译<PackageName>
包的所需要的预处理或者编译选项,例如-I/usr/include
,指定编译<PackageName>
包的头文件搜索路径。--libs
:获取编译<PackageName>
包所需要的链接选项,例如-L/usr/lib
指定库文件搜索路径,或-lXXX
指定具体的库文件。
下面以一个例子来说明 pkg-config
的用法,例子将会用到我们自己编写的 mymath
库。程序很简单,就是调用一个 mymath
库提供的函数:
1 | // test.cpp |
对于 mymath
库,我们给出它的结构和代码如下:
1 | ├── CMakeLists.txt |
1 | // mymath.h |
1 | // mymath.cpp |
1 | // CMakeLists.txt |
mymath 库的源码可以 点击链接下载。
有了 mymath.h
、mymath.cpp
、CMakeLists.txt
这三个文件后,我们在 build
目录下执行 cmake ..
,然后再执行 make
,将会生成 libmymath.a
的静态库。把该静态库复制到 lib
目录下即可。
1 | ~/Code/cmake/mymath/build ❯ cmake .. |
这个时候,直接使用 g++ -o test test.cpp
是无法编译通过的,因为我们不知道关于 mymath 库的任何信息(例如 头文件mymath.h
在哪个目录下,mymath 库在哪个目录下等等),此时就是 pkg-config
发挥作用的时候了。
如何让 pkg-config
找到所需的第三方库?
从前面的介绍可以知道,pkg-config
会在常用的系统路径下查找 .pc
文件,除此之外,还会查找 PKG_CONFIG_PATH
环境变量指定的路径。那么如何让 pkg-config
找到并使用 OpenCV 呢?需要两个步骤:
- 编写库相关的
.pc
文件; - 将
.pc
文件放在pkg-config
的查找路径之下;
第二点好办,将 .pc
文件放在几个指定的路径或者环境变量 PKG_CONFIG_PATH
指定的路径即可,那么 .pc
文件怎么编写呢?
.pc
文件的格式
.pc
是用来描述一个库的名称、版本、编译选项、链接选项等内容的文件,因此它需要包含:名称、描述、版本信息、编译选项和链接选项几个部分,具体来说,是对 Name、Description、Version、Cflags、Libs 五个变量的一个定义,定义方式为变量: 内容,其中 Cflags
和 Libs
可能会使用编译或者链接的一些选项,例如 -I
、-L
等。
1 | # mylib.pc |
当然,这个文件也可以定义其他变量,以方便使用。例如目录可以使用一个变量来定义,这样在 Cflags
或 Libs
中就直接使用该变量即可,例如:
1 | # mylib.pc |
下面来写一个 mymath 库的简单示例。
1 | # mymath.pc |
点击下载 包含 .pc
文件的 mymath 库。
让 .pc
文件对 pkg-config
可见
这里我采用把 mymath.pc
的路径添加到环境变量 PKG_CONFIG_PATH
中的方式。
此时,在终端中执行下面的命令来获取 mymath 库的信息:
1 | ~/Code/cmake/mymath ❯ pkg-config --list-all | grep "mymath" |
测试 pkg-config
对 mymath
库的使用
编译命令如下
1 | // 在终端中执行 |
运行结果:
1 | ~/Code/cmake/myproj ❯ g++ -o test test.cpp `pkg-config --cflags --libs mymath` |