问题现象
今天在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