日期:2014-05-16  浏览次数:20618 次

GNU/Linux中动态库的搜索路径的指定方法汇总

/*********************************************************************
 * Author  : Samson
 * Date    : 04/03/2014
 * Test platform:
 *              Linux ubuntu 3.2.0-58-generic-pae
 *              GNU bash, version 4.2.39
 * *******************************************************************/


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

1.编译目标代码时使用-L指定的动态库搜索路径;

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

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

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

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

以上的3~5步中,不再需要手动地指定动态库搜索路径了,
有一个可以进行配置更新默认的搜索路径的命令:
ldconfig

ldconfig命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表.


例如:
我编译了个动态库文件,copy到/usr/lib下,这时使用ldconfig搜索一下我复制过去的库是否已经在能够配置成功;
root@ubuntu:/home/v0id/tools/android-ndk-r9c/samples/hello-jni# cp libs/x86/libhello-jni.so /usr/lib
root@ubuntu:/home/v0id/test# ldconfig -p | grep jni
无任何返回结果;

使用ldconfig命令进行配置后:
root@ubuntu:/home/v0id/test# ldconfig  /usr/lib
root@ubuntu:/home/v0id/test# ldconfig -p | grep jni
root@ubuntu:/home/v0id/test# ldconfig -p | grep jni
    libhello-jni.so (ELF) => /usr/lib/libhello-jni.so


例子2:
不在默认目录下,/etc/ld.so.conf文件中的内容为:
include /etc/ld.so.conf.d/*.conf
那么在/etc/ld.so.conf.d/建立一个yygytest.conf文件,配置库的新路径,内容如下:
/home/v0id/test/yygylib
同时把放在/usr/lib目录下的libhello-jni.so动态库移动到/home/v0id/test/yygylib目录下,再使用ldconfig更新动态库路径的配置,命令如下:
root@ubuntu:/etc/ld.so.conf.d# mv /usr/lib/libhello-jni.so /home/v0id/test/yygylib/
root@ubuntu:/etc/ld.so.conf.d# ldconfig -p | grep jni
    libhello-jni.so (ELF) => /usr/lib/libhello-jni.so
root@ubuntu:/etc/ld.so.conf.d# ldconfig  
root@ubuntu:/etc/ld.so.conf.d# ldconfig -p | grep jni
    libhello-jni.so (ELF) => /home/v0id/test/yygylib/libhello-jni.so

当一个动态库文件从目录中删除时,再次使用ldconfig即可更新动态库的路径的配置:_(