14-----关于error while loading shared libraries: xxx.so: cannot open shared object file: No such file

一 linux找不到动态链接库 .so文件的解决方法

关于这种问题,很明显是自己生成的动态库在被使用时,无法找到准确的路径而导致的。

1 问题分析

首先运行可以执行程序,若出现上述错误,说明找不到动态库的路径。我们需要使用ldd去查看哪个动态库缺少了。

./nginx
ldd ./nginx | grep "not found"

在这里插入图片描述

find / -name libOnvif_Client.so 2> /dev/null	#不是root可能需要加sudo

然后找到这些缺少的动态库路径。
在这里插入图片描述

找到后该路径后,往/etc/ld.so.conf文件添加进去,然后更新即可。

echo  /xxx/lib >> /etc/ld.so.conf	
ldconfig /etc/ld.so.conf	#立即更新配置,实际上后面的/etc/ld.so.conf参数可以省略

此时该程序就可以成功运行。
实际上我的openssl下载时Linux下安装openssl也告诉了我们如何解决。但是本篇将更详细的针对这一问题进行解决。

2 总结解决方法

2.1 第一种解决方法

#1 修改 LD_LIBRARY_PATH,指明共享库的路径。LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。只对当前shell有效。
export LD_LIBRARY_PATH = your lib dir

#2 通过/etc/ld.so.conf文件来指定动态库的目录。然后运行ldconfig命令更新搜索共享库的路径。通常这样做就可以解决库无法链接的问题了。永久有效。
做法在上面,这里不多讲。

#3 把库文件拷贝到系统库的lib下,然后ldconfig,肯定就行了,这但是会破坏原库文件的纯洁性,不应是首选方法。

#4 在~/.bashrc文件下加入以下内容,~/.bashrc是每一个用户的配置目录,只对当前用户有效。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:your lib dir
source ~/.bashrc  #激活配置

个人现在比较倾向使用第4种,因为只对本用户有效,不影响整个系统,当然你也可以使用第2种,它对整个系统有效,唯一的坏处是,如果别人想用同一个库时,会优先链接了你这个私有库,而不是系统自带的库,从而导致未知错误。
这是我自己用第4种,需要链接多个动态库的写法截图:
在这里插入图片描述
但是上面做好之后,每次开启新的终端shell,都需要手动执行以下命令,否则还是无法检测到该动态库的路径。

source ~/.bashrc 

所以为了解决上面每次在linux打开新的终端都需要敲命令的情况,我们可以按照下面的做法:

vim ~/.bash_profile	#新建新的配置(可能有的用户已经存在该文件)
#输入以下内容:
#-f代表是否存在该文件
if [ -f ~/.bashrc ] ; then
        source ~/.bashrc
fi

上面就已经搞定了。

上面这样做,是因为profile文件的执行顺序比.bashrc高,每次创建新的终端都会被默认执行。
linux配置文件执行顺序为:

/etc/profile→ (~/.bash_profile | ~/.bash_login | ~/.profile)→ ~/.bashrc →/etc/bashrc → ~/.bash_logout

3 额外优化

我们在使用动态库进行链接时,可能不小心会链接进来了一些未使用的动态库,当我们需要发布时,去掉这些没用的动态库是不错的选择。我们可以通过以下命令查看链接了哪些多余的动态库:
在这里插入图片描述

4 总结

关于处理这种问题的方法,我们上面已经讲得很清楚了,关于动态库的链接优先级,大家可以自己去测试一下,不难的,这里可以提供一个思路,写个测试程序,然后在上面的方法在都提供对应的链接路径,然后对生成的动态库使用ldd进行查看链接动态库的路径。第一次可以看到最优先链接的路径。第二次把最优先的路径删除,然后再用同样的方法找到第二个优先的路径,依次擂台。

下面是链接中的文章博主给出的顺序,我还没测试过:
1、RUMPATH 优先级最高。
2、RPATH 其次。
3、LD_LIBRARY_PATH。
4、 /etc/ld.so.cache。
5、 /usr/lib/ /lib/。

参考文章:
linux找不到动态链接库 .so文件的解决方法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值