linux管理 共享库文件

来源:互联网 发布:简易数控折弯机编程 编辑:程序博客网 时间:2024/06/06 03:58
Linux运行的时候,是如何管理共享库(*.so)的?
在 Linux 下面,共享库的寻找和加载是由 /lib/ld.so 实现的。


1、标准库文件路径
 ld.so在标准路经(/lib, /usr/lib) 中寻找应用程序用到的共享库。
 //////往/lib和/usr/lib里面加东西,是不用修改/etc/ld.so.conf的,
///////但是完了之后要调一下ldconfig,不然这个library会找不到


2、非标准库文件路径
但是,如果需要用到的共享库在非标准路经,ld.so 怎么找到它呢?

(1)目前,Linux 通用的做法是将非标准路经加入 /etc/ld.so.conf,然后运行 ldconfig 生成/etc/ld.so.cache。 ld.so 加载共享库的时候,会从 ld.so.cache 查找。
  /////想往标准两个目录以外加东西的时候,一定要修改/etc/ld.so.conf,然后再调用ldconfig,不然也会找不到库文件。比如安装了一个mysql到/usr/local/mysql,mysql有一大堆library在/usr/local/mysql/lib下面,这时就需要在/etc/ld.so.conf下面加一行/usr/local/mysql/lib,保存过后ldconfig一下,新的library才能在程序运行时被找到。

(2)传统上,还有一种临时的解决方案,Linux 的先辈 Unix 还有一个环境变量:LD_LIBRARY_PATH 来处理非标准路经的共享库。ld.so加载共享库的时候,也会查找这个变量所设置的路经。
         LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib
         export LD_LIBRARY_PATH

      ///////export一个全局变量LD_LIBRARY_PATH,然后运行程序的时候就会去这个目录中找library。
     ////////如果想在这两个目录以外放lib,但是又不想在/etc/ld.so.conf中加东西(或者是没有权限加东西).那也可以,就是export一个全局变量LD_LIBRARY_PATH,然后运行程序的时候就会去这个目录中找library。
     ///////一般来讲这只是一种临时的解决方案,在没有权限或临时需要的时候使用。

            但是,有不少声音主张要避免使用LD_LIBRARY_PATH 变量,尤其是作为全局变量。这些声音是:
           * LD_LIBRARY_PATH is not the answer - http://prefetch.net/articles/linkers.badldlibrary.html
           * Why LD_LIBRARY_PATH is bad - http://xahlee.org/UnixResource_dir/_/ldpath.html
           * LD_LIBRARY_PATH - just say no - http://blogs.sun.com/rie/date/20040710
            解决这一问题的另一方法是在编译的时候通过 -R<path> 选项指定run-time path。
(3)永久解决方案

        接下来的问题是:以上做法,只是临时设置变量 LD_LIBRARY_PATH ,下次开机,一切设置将不复存在;如何把这个值永久写到 LD_LIBRARY_PATH 里呢?

         我们可以在 ~/.bashrc 或者 ~/.bash_profile 中加入 export 语句,前者在每次登陆和每次打开 shell 都读取一次,后者只在登陆时读取一次。我的习惯是加到 ~/.bashrc 中,在该文件的未尾,可采用如下语句来使设置生效:

       export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

          修改完后,记得关掉当前终端并重新打开一个新的终端,从而使上面的配置生效。


 

3. 查找优先级如下(Linux):

        ① LD_LIBRARY_PATH 环境变量指定目录

        ② /etc/ld.so.conf指定目录

        ③ 标准路径 先/usr/lib 再 /lib


0 0