zoukankan      html  css  js  c++  java
  • linux中动态链接库的搜索顺序

    在接手一个很古老的程序时,发现其所使用的动态库都实在是太陈旧了,正式运行环境中部署的库都是相适应的,而目前的开发测试环境中均是部署的新的升级版本。为了能在这些环境下开发测试,程序得能在自定义的路径里来搜索。因此在这里复习一下linux中程序对动态链接库的搜索顺序,如下所述:

    1.首先查看程序文件的.dynamic 段是否包含了一个叫DT_RPATH的项(它是一个以冒号分隔的库文件搜索目录列表)。

       怎么设置这个选项?

       需要在编译连接程序的时候使用-Wl,-rpath选项,假设一个程序test需要使用liblib.so库,如下所示进行编译连接:



    g++ -o test -L. -llib -Wl,rpath=./ test.cpp


    这样在执行test程序时,test便会先到./即当前目录下查找所需要的动态库liblib.so

    2.查找是否存在环境变量 LD_LIBRARY_PATH(它是一个以冒号分隔的库文件搜索目录列表)。

       怎么设置这个选项?当然是设置linux下的环境变量就可以了。

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./


    当然,这种方法是对当前登录生效的。如果想开机即有效,跟其它环境变量的设置也是一样,需要修改一些配置文件。

    3.查看库高速缓存文件 /etc/ld.so.conf ,它包含了库名和路径的一个对应列表,如果库名存在,连接器就使用它对应的路径,用这个查找方法能够找到大部分的库。

       怎么设置这个选项?可以直接编辑ld.so.conf加入需要查找的路径,也可以在/etc/ld.so.conf.d目录下的己有文件中加入路径,或者在该目录下新建一个文件(名字为*.conf即可),再把需要的路径加入到该文件中。最后执行ldconfig即可生效。

    4.查找默认路径/lib和/usr/lib,

    如果经过了以上的步骤仍然查找失败,则将报错并退出相关程序。

    对于前三个步骤来说,我们均是可以进行设置调整的,其中第三个步骤中的设置需要root权限才能进行,且会影响所有的程序。当使用第一、第二中的方法进行了设置调整后,我们便可以使多种版本的库共存在同一环境下进行测试,同名也无所谓。
    *********************************************************************

    环境变量LD_LIBRARY_PATH用来指定查找共享库时除了默认路径之外的其他路径。(该路径在默认路径之前查找)
    移植程序时的经常碰到需要使用一些特定的动态库,而这些编译好的动态库放在我们自己建立的目录里,这时我们可以设置LD_LIBRARY_PATH。
    例:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/work/lib/
    这样就可以使用/work/lib/下的库文件了,运行程序后系统会自动到环境变量LD_LIBRARY_PATH指定的路径中查找其所需的库。
    系统查找动态库的顺序
    系统先找LD_LIBRARY_PATH下的库再找/lib and /usr/lib等路径下的库,还有/etc/ld.so.conf里指定的路径(如果ld.so.conf存在),man ldconfig for more information
    [url=http://infomax/bbs/misc.php?action=viewratings&tid=111&pid=228][/url]
    使Linux启动之后就加载LD_LIBRARY_PATH的路径
    /etc/rc.d/rc.local文件中加入export LD_LIBRARY_PATH="xxxxx" 即可
    如果在链接时使用了"-R"和"-L"选项,则相关动态库的路径将保存在ELF文件中,于
    是以后的运行中不再需要设置环境变量去定位动态库。比如,有一个
    /usr/local/lib/libfoo.so,而你的bar程序需要这个libfoo.so,编译、链接时最好
    这样 :gcc -Wall -pipe -O3 -o bar -R/usr/local/lib -L/usr/local/lib bar.c -lfoo

  • 相关阅读:
    Java线程之Callable和Future
    Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor
    hdu 6201 transaction transaction transaction
    三分钟读懂TT猫分布式、微服务和集群之路
    springcloud(十):服务网关zuul初级篇
    springcloud(九):配置中心和消息总线(配置中心终结版)
    springcloud(八):配置中心服务化和高可用
    springcloud(七):配置中心svn示例和refresh
    springcloud(六):配置中心git示例
    最简单的SpringBoot整合MyBatis教程
  • 原文地址:https://www.cnblogs.com/vanishfan/p/2861211.html
Copyright © 2011-2022 走看看