天天看点

linux下mkdir头文件_整理Linux下gcc编译中关于头文件与库文件搜索路径相关问题

态库./libpos.so、 /root/test/env/lib/libpos.so和/root/test/conf/lib/libpos.so。我们再用源程序 pos_lib.c(见程序5)来创建动态库/lib/libpos.so,用源程序pos_usrlib.c(见程序6)来创建动态库 /usr/lib/libpos.so。

#include

void pos()

{

printf("/lib\n");

}

程序5: pos_lib.c

#include

void pos()

{

printf("/usr/lib\n");

}

程序6: pos_usrlib.c

这 样我们得到五个动态库libpos.so,这些动态库的名字相同,且都包含相同函数原型 的公用函数pos。但存储的位置不同和公用函数pos 打印的结果不同。每个动态库中的公用函数pos都输出该动态库所存放的位置。这样我们可以通过执行例3中的可执行文件pos得到的结果不同获知其搜索到了 哪个动态库,从而获得第1个动态库搜索顺序,然后删除该动态库,再执行程序pos,获得第2个动态库搜索路径,再删除第2个被搜索到的动态库,如此往复, 将可得到Linux搜索动态库的先后顺序。程序pos执行的输出结果和搜索到的动态库的对应关系如表1所示:

程序pos输出结果

使用的动态库

对应的动态库搜索路径指定方式

./

./libpos.so

编译目标代码时指定的动态库搜索路径

/root/test/env/lib

/root/test/env/lib/libpos.so

环境变量LD_LIBRARY_PATH指定的动态库搜索路径

/root/test/conf/lib

/root/test/conf/lib/libpos.so

配置文件/etc/ld.so.conf中指定的动态库搜索路径

/lib

/lib/libpos.so

默认的动态库搜索路径/lib

/usr/lib

/usr/lib/libpos.so

默认的动态库搜索路径/usr/lib

表1: 程序pos输出结果和动态库的对应关系

创建各个动态库,并放置在相应的目录中。测试环境就准备好了。执行程序pos,并在该命令行中设置环境变量LD_LIBRARY_PATH。

# LD_LIBRARY_PATH=/root/test/env/lib ./pos

./

#

根据程序pos的输出结果可知,最先搜索的是编译目标代码时指定的动态库搜索路径。然后我们把动态库./libpos.so删除了,再运行上述命令试试。

# rm libpos.so

rm: remove regular file `libpos.so'? y

# LD_LIBRARY_PATH=/root/test/env/lib ./pos

/root/test/env/lib

#

根据程序pos的输出结果可知,第2个动态库搜索的路径是环境变量LD_LIBRARY_PATH指定的。我们再把/root/test/env/lib/libpos.so删除,运行上述命令。

# rm /root/test/env/lib/libpos.so

rm: remove regular file `/root/test/env/lib/libpos.so'? y

# LD_LIBRARY_PATH=/root/test/env/lib ./pos

/root/test/conf/lib

#

第3个动态库的搜索路径是配置文件/etc/ld.so.conf指定的路径。删除动态库/root/test/conf/lib/libpos.so后再运行上述命令。

# rm /root/test/conf/lib/libpos.so

rm: remove regular file `/root/test/conf/lib/libpos.so