转载自->这里
我们知道,linux编译源码包基本步骤无非是:configure,make,make install三部曲;configure过程中可能会遇到无法找到某些头文件和动态库;原因有两个:
(1)系统压根就没有这些头文件和动态库。(locate XXXX.h/so 未找到)
(2)已经安装相关的头文件和动态库。但未将头文件和动态库拷贝到标准路径下。
对于第(2)中情况,我们可以通过配置PKG_CONFIG_PATH环境变量来解决头文件和动态库无法找到的问题;
先介绍一下pkg-config的用法:
pkg-config命令经常被用于Makefile文件用来找寻头文件和动态链接库,最常用的方式:
[root@localhost ~]# pkg-config --cflags --libs libcfg -I/ext/corosync/include -L/ext/corosync/lib -lcfg
上述命令用于返回libcfg.so的链接路径,以及相关的头文件路径。
pkg-config是如何找到libcfg.so的存放路径和头文件的存放路径的呢?pkg-config会查找libcfg.pc文件;该文件存
放了头文件和动态链接库的路径存放信息;libcfg.pc文件内容如下:
prefix=/ext/corosync exec_prefix=${prefix} libdir=/ext/corosync/lib includedir=${prefix}/include Name: cfg Version: 1.3.3 Description: cfg Requires: Libs: -L${libdir} -lcfg Cflags: -I${includedir}
那么pkg-config如何找到libcfg.pc文件的呢?相信同学们肯定猜到了,就是PKG_CONFIG_PATH环境变量;一般情况下动态库都存放在安装目录下的lib目录下,libcfg.so存放在/ext/corosync/lib/目录下;同时该目录下有一个pkgconfig目录,相信经常编译源代码的同学对这个目录并不陌生,该目录下存放的就是*.pc文件,存放着我们的动态库和头文件路径元数据。通过设置PKG_CONFIG_PATH为我们/ext/corosync/lib/pkgconfig;pkg-config命令就可以轻松找到*.pc
文件,进而找到路径信息。
好了,经过上述设置后,configure便可以顺利的生成Makefile文件了。make,make install就可以了。
到此为止,我们仅仅完成了程序的编译和链接,还有最后一步,程序运行;程序运行需要加载动态链接库并运行,也需要找寻动态链接库的路径,pkg-config仅负责编译链接时头文件和动态链接库的查找。对于程序运行时加载动态链接库,pkg-config就无能为力了,此时需要用到ldconfig命令,该命令为程序运行时提供动态链接库的运行时绑定,通过加载/etc/ld.so.conf下的路径信息,生成动态库的缓存/etc/ld.so.cache,为程序运行时提供动态库的链接;通过ldconfig -p查看动态链接库缓存信息。因此需要将我们的动态链接库路径添加到/etc/ld.so.conf中,运行ldconfig更新cache,就大功告成了。