问题背景:旧的服务器上编译module成功,但是新的服务器上(gcc和系统都一样)编译module的过程中发现没有找到libexpat.so,很容易的老问题,索性写一篇来说明。本文详细介绍了linux 下gcc头文件指定方法,以及搜索路径顺序的问题。另外,还总结了,gcc动态链接的方法以及路径指定,同样也讨论了搜索路径的顺序问题。

1 搜索头文件

头文件的搜索顺序是:

  1. 从-I开始
  2. 然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH
  3. 再找内定目录/usr/include /usr/local/include /usr/lib/gcc-lib/i386-linux/2.95.2/include /usr/lib/gcc-lib/i386-linux/2.95.2/……/……/……/……/include/g++-3 /usr/lib/gcc-lib/i386-linux/2.95.2/……/……/……/……/i386-linux/include库文件

但是如果装gcc的时候,是有给定的prefix的话,那么就是

  1. /usr/include
  2. prefix/include
  3. prefix/xxx-xxx-xxx-gnulibc/include
  4. prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include

2 搜索静态库

  1. ld会去找GCC命令行中的参数-L的目录中是否有该静态库;
  2. 再去找GCC的环境变量LIBRARY_PATH
  3. 再找内定目录/lib、/usr/lib、/usr/local/lib夏是否有该链接库,这是当初compile gcc的时候确定的

3 运行时搜索动态库

动态库链接时、执行时搜索路径顺序

  1. 编译目标代码时指定的动态库搜索路径;
  2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
  3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径;
  4. 默认的动态搜索路径/lib;
  5. 默认的动态库搜索路径/usr/lib

大家可以看到/etc/ld.so.conf这个配置文件中制定了动态库搜索路径,如下图所示,主要包含了/etc/ld.so.conf.d/路径下的配置文件,

ldso.png

那么我们看ld.so.conf.d/下的配置文件有哪些呢?如下图所示

ldsoconfd.png

而每个conf也只是包含了动态库文件所在的路径,所以如果自己编译到的so文件需要自行调用的时候,当然可以把它的路径加到conf文件中,但是一般推荐直接放在/usr/lib下或者创建超链接,这样就不用每次部署或者每个人在自己的本地开发的时候修改conf。

 

最后回到context,libexpat.so是apr-util编译出的动态库文件,我们在/usr/lib下面创建了超链接,问题就解决了

 

 

登录发表评论 注册

反馈意见