Linux链接动态库的方式

Linux下应用程序链接动态库有以下三种方式:


  • 改变LD_LIBRARY_PATH

export LD_LIBRARY_PATH=/home/bow/all/program/test/lib_version_test:$LD_LIBRARY_PATH

这里/home/bow/all/program/test/lib_version_test是共享库的路径。虽然改变LD_LIBRARY_PATH能达到目的,但是不推荐使用,因为这是一个全局的变量,其他应用程序可能受此影响,导致各种库的覆盖问题。如果要清除这个全局变量,使用命令unset LD_LIBRARY_PATH

注:由于直接执行export  LD_LIBRARY_PATH=LD_LIBRARY_PATH:/XXX 但是登出后就失效。所以一般是在.bashrc文件中添加export  LD_LIBRARY_PATH=LD_LIBRARY_PATH:/XXX,再执行source .bashrc


  • 用rpath

在编译应用程序时,利用rpath指定加载路径。 
gcc -L. -Wl,-rpath=/home/bow/all/program/test/lib_version_test -o test main.o -ltest 
这样,虽然避免了各种路径找不到的问题,但是也失去了灵活性。因为库的路径被定死了。


  • 改变ld.so.conf

 将路径添加到此文件,然后使用ldconfig更新加载程序的cache。


动态库在编译和运行加载阶段搜索路径的先后顺序


编译时,查找顺序

•/usr/local/lib
•/usr/lib
•用-L指定的路径,按命令行里面的顺序依次查找

运行加载时的顺序

•可执行程序指定的的DT_RPATH
•LD_LIBRARY_PATH. 但是如果使用了setuid/setgid,由于安全因素,此路径将被忽略.
•可执行程序指定的的DT_RUNPATH. 但是如果使用了setuid/setgid,由于安全因素,此路径将被忽略
•/etc/ld/so/cache. 如果链接时指定了‘-z nodeflib’,此路径将被忽略.
•/lib. 如果链接时指定了‘-z nodeflib’,此路径将被忽略
•/usr/lib. 如果链接时指定了‘-z nodeflib’,此路径将被忽略

你可能感兴趣的:(Linux)