一般项目主要使用 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
从源码包安装软件最重要的就是仔细阅读README INSTALL等说明文件它会告诉你怎样才能成功安装
通常从源码包安装软件的步骤是:
tar jxvf gtk+-2.4.13.tar.bz2 解开源码包
cd gtk+-2.4.13/ 进入源码目录
./configure 似乎在某些环境下./configure会造成终端退出
而使用. configure则会正常运行,如果有这个现象,就试试 . configure
通过configure程序猜测主机信息,最终建立Makefile,以完成make,所以如果./configure不成功
而去make的话,就会出现”make: *** No targets specified and no makefile found. Stop.”
make 当./configure成功结信灶老束后,就开始正式编译程序了.
make install 编译成功后使用make install安装
make uninstall 某些软件支持卸载,可能使用该方法卸载,如果支持的话,通常会在README中写到(似乎比较少)
configure程序带有很多参数,可以通过 ./configure –help 查看详细内滑升容,通常位于前面的是常规configure的
参数说明,末尾是该程序的可用参数说明。
./configure –prefix=/usr 指定安装目录,通常从源码包编译安装的软件辩团默认会放在/usr/local下
当开发过程中使用第三方库时,我们需要知道被使用的第三方库,它包含的头文件在哪儿、它依赖哪些库、它的编译选项有哪些、它的链接选项有哪些等等,也就是说需要知道这些信息我们才能正确的编译和链接它。当然可以通过直接在编译选项中指定的方式来使用,但是,对于一些大型或者比较复杂的第三方库,包含的头文件或者依赖库非常多、非常复杂的时候,这样做的成本就非常高,而且非常不便于在不同平台之间的移植。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 库的信息了:
编译命令如下:
运行结果:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)