日常随笔-loading shared libraries: XXXXX cannot open shared object file: No such file or directory

问题现象

今天在ubuntu上安装程序客户端(XXX-qt5)时,由于下载已编译的版本不兼容ubuntu22,所以想着把源码下载下来自己编译,编译XXX-qt5需要依赖一个A.so.2动态链接库,所以要先编译A。
等我编译完后启动的时候问题出现了,启动ss-qt5时报错

ss-qt5: error while loading shared libraries: XXXXX: cannot open shared object file: No such file or directory

对linux系统不是很了解,但是我清楚的知道我刚才不是编译安装了A时吗,怎么没有。我搜索了一下这个库,明明是有这个库,在/usr/local/lib下,但是依然报错
在这里插入图片描述

问题原因

在linux系统中,一个软件可能依赖一个库,其实很多程序都可能依赖一个相同的库,所以这个相同的库就可以作为一个共享库,那么依赖了它的程序都可以共用同一个库,这个就是动态链接库,他在程序启动的时候会加载。
我们上边的程序可能就是因为动态库是新安装的,而动态连接库查找可能存在缓存,所以我们启动ss-qt5的时候链接库缓存中确实找不到A.so.2导致我们启动程序失败

解决办法

当添加完动态库后执行一下ldconfig命令,这个命令可以搜索出可共享的动态链接库(格式如lib*.so*), 进而创建出动态装入程序所需的连接和缓存文件中。然后再启动程序就应该不会报No such file or directory问题了

sudo /sbin/ldconfig -v
追本溯源

如果你对根本原因感兴趣,那么你可以接着看下边。知道问题的解决方法有时对我们日常工作已经足够,但是大多数程序员都有一个好奇的心。

linux动态库存放目录
  • 系统默认:/lib/、/usr/lib/,放在这两个目录下的动态库是不需要再改动其他文件的,只需要执行ldconfig刷新一下缓存
  • 自定义目录:那么必须将存放so文件的目录加入到/etc/ld.so.conf/中,然后再执行ldconfig,比如我的/etc/ld.so.conf/下的libc.conf文件中就有/usr/local/lib,A.so.2就在这个目录下
    在这里插入图片描述
linux动态库加载过程

动态库是有动态链接器(ld-linux.so)来完成的,动态链接器会根据以下的优先级顺序来搜索和加载

  • RPATH
  • LD_LIBRARY_PATH环境变量
  • /etc/ld.so.cache缓存文件
  • /lib/和/usr/lib默认lib目录
    这下你应该知道你的动态库应该放在哪里和如何设置了吧
ldconfig动态链接库管理命令

主要作用就是在默认搜寻目录/lib和/usr/lib以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如xxx.so.),进而创建出动态链接器(ld-linux.so)所需的连接和缓存文件,缓存文件默认存放/etc/ld.so.cache。更多ldconfig用法可以在终端执行ldconfig --help来查看帮助文档

ldconfig --help
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值