linux动态库加载相关

linux下动态库搜索规则

(1)编译目标代码时指定的动态库搜索路径,也就是RPATH;

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

(3)配置文件/etc/ld.so.conf中指定的动态库搜索路径;配置完毕后需运行ldconfig命令生效;

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

(5)默认的动态库搜索路径/usr/lib;

即从(1)到(5)依次搜索。

如果程序运行时存在找不到库的问题,自然也可根据上述库的搜索规则做出应对方案。

首先是通过指定环境变量LD_LIBRARY_PATH和修改配置文件/etc/ld.so.conf的方式,这两种方式的作用域是全局的,弊端在于使用太多会污染系统环境且会影响到其他程序的执行,因此常用于调试。

其次是把需要的库放到系统默认的动态库搜索路径下,这种方式的作用域也是全局的。倘若需要的动态库是某个特定的库,放到系统路径下也无妨,但若是某个开源库且其他程序可能会用到,如OpenSSL库等,这样做就可能会导致其他程序发生问题。

最后,最优解还是在程序编译链接时加入-rpath 参数,指明可执行文件在寻找.so文件时的第一优先位置。其中库的路径信息保存在可执行文件中,运行时会直接到该路径查找库,避免了使用LD_LIBRARY_PATH环境变量查找。这种方式既不会污染系统环境也非常方便。

当然,该最佳解决方式是需要重新编译链接程序的,如果不想这么做或者条件不允许怎么办呢?有没有什么办法可以让程序优先加载当前目录的动态库?答案是设置环境变量LD_LIBRARY_PATH,设置方法有三种:

(1)临时修改,在终端输入export LD_LIBRARY_PATH=./,终端关掉就失效;

(2) 修改~/.bash_profile或~/.bashrc文件,在文件末尾输入LD_LIBRARY_PATH=./ 和 export LD_LIBRARY_PATH,注此方式仅对当前登录用户有效;

(3)修改/etc/profile文件,在末尾输入LD_LIBRARY_PATH=./ 和 export LD_LIBRARY_PATH,此方式对所有用户有效。

方法1:

        让/etc/profile文件修改后立即生效 ,可以使用如下命令:

        # .  /etc/profile

        注意: . 和 /etc/profile 有空格

方法2:

        使用source命令
         source /etc/profile

       

        

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值