
pkg-config 就是解决这个问题的一种方案。
pkg-config 是一个用于获取系统中安装的包/库的相关信息(例如依赖头文件目录、依赖库文件目录)的程序,通常用于编译和链接一个或多个库,典型的用法为:
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>,其含义分别为:
下面以一个例子来说明 pkg-config 的用法,例子将会用到 liblzma 库(可以使用 pkg-config --list-all 来查看当前 pkg-config 已经识别的库),程序很简单,就是通过调用一个接口打印出 liblzma 的版本号,当然,接口是库 liblzma 提供的:
lzma.h 是 lzma 库提供的一个头文件, lzma_version_string 是 lzma 库提供的一个接口,功能为获取 lzma 库的版本号,不需要入参,返回一个常量字符串。程序调用此接口并将版本号打印出来。
直接使用 g++ -o test test.cpp 是无法编译通过的,因为我们不知道关于 lzma 库的任何信息(例如头文件 lzma.h 头文件在哪个目录下, lzma 库在哪个目录下等等),此时就是 pkg-config 发挥作用的时候了,编译命令如下:
编译通过后得到可执行文件 test ,在我的环境中运行 test 得到如下输出:
从前面的介绍可以知道, pkg-config 会在常用的系统路径下查找 .pc 文件,除此之外,还会查找 PKG_CONFIG_PATH 环境变量指定的路径。
那么自己编写的库,想让 pkg-config 找到并使用,需要两个步骤:
第二点好办,将 .pc 文件放在几个指定的路径或者环境变量 PKG_CONFIG_PATH 指定的路径即可,那么 .pc 文件怎么编写呢?
下面来写一个简单的示例,
首先编写一个库文件,目录结构如下:
库文件提供的内容很简单:一个 add 接口用于计算两个整数的和并打印出来。由于是使用库的方式, mymath.cpp 文件只是在编译 libmymath.a 时需要使用,并不需要对外提供,下面是 mymath.cpp 和 mymath.h 的内容:
头文件和库文件所在的目录根据实际指定即可,此处以 /XXX 代替.
可以把 mymath.pc 拷贝到系统查找的几个目录或者将 mymath.pc 文件所在的目录添加到环境变量 PKG_CONFIG_PATH 中,此处使用第二种办法:
这样就可以使用 pkg-config 命令来获取 mymath 库的信息了:
编译命令如下:
运行结果:
pkg-config安装比较简单,Debian apt-get install pkg-config Mac brew install pkg-config
一般项目主要使用 pkg-config 的两个命令,例如opencv安装后,在Makefile中配置opencv的路径, pkg-config --cflags opencv 、 pkg-config --libs opencv 来在编译阶段寻找opencv 的include 目录以及在链接阶段寻找libs目录
pkg-config 能够找到正确路径的前提是需要配置 $(progam).pc 文件,例如 pkg-config --cflags opencv 命令能正常工作的前提就是需要在pkg-config 的配置扫描路径下有 opencv.pc 文件
pkg-config 的默认扫描路径大概有这么几个地方: /usr/local/share/pkgconfig、 /usr/lib/pkgconfig、/usr/local/lib/pkgconfig 可通过 pkg-config --variable pc_path pkg-config 查询
有文档指出也能通过环境变量 PKG_CONFIG_PATH 进行指定,但是直接去默认扫描路径定义对应的.pc文件更直接
Mac 上brew安装的开发包一般会在/usr/local/lib/pkgconfig 下建立软链
.pc文件定义,可以直接参考pkg-config 的默认扫描路径下其他.pc文件的写法,或者参考下面的配置文件opencv.pc
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)