Linux程序找不到共享库 .so 文件
运行 Linux 程序的时候提示找不到共享库错误: error while loading shared libraries: libLinuxCpp_02_Lib.so: cannot open shared object file: No such file or directory。
Linux程序在加载 so 库文件时,搜索顺序依次如下所示。如果所有的位置都找不到,就会爆以上的错误信息,提示找不到共享库。因此优先级也是从上到下依次降低,即如果多个地方都进行了不同的设置,则会按照优先级高的设置进行搜索
rpath
信息,编译链接时写入到可执行文件内部的数据LD_LIBRARY_PATH
环境变量runpath
信息,编译链接时写入到可执行文件内部的数据/etc/ld.so.conf
文件中列出的路径/lib、/usr/lib
等系统默认路径
对于运行时找不到共享库,常用的有三种方式:
- 编辑自己的
.conf
文件 - 添加临时环境变量
LD_LIBRARY_PATH
- 将.so 文件拷贝到系统默认加载共享库的路径:
/lib
,/usr/lib
下
方法一、添加编辑自定义 .conf
文件
该方式为发布程序时,加载附加 .so文件的常用方法,可以避免修改系统自带的 .conf
文件,也是较为推荐的方法。
1、创建自定义 .conf
文件
# 进入到 /etc/ld.so.conf.d 目录下
cd /etc/ld.so.conf.d/
# 创建 xxx.conf 文件,文件名称自定,文件类型必须为 .conf
sudo vim libCustom.conf
2、将依赖.so
文件路径添加进来
在新建的 libCustom.conf
文件中,添加所依赖的 .so 文件的路径,以告诉系统在哪里去找对应的共享库。然后保存并退出。
/home/projects/LinuxCpp_02_Lib/bin/x64/Debug/
3、更新动态链接库缓存
sudo ldconfig
执行更新动态链接库缓存的命令,以保证新增加的共享库能够被系统识别。然后执行可执行程序将不会提示找不到共享库的错误。
方法二、添加环境变量 LD_LIBRARY_PATH
1、在当前终端中设置临时环境变量
- 将只对当前终端运行该程序时有效,为临时设置便于测试,临时生效
export LD_LIBRARY_PATH = $LD_LIBRARY_PATH: </home/projects/LinuxCpp_02_Lib/bin/x64/Debug>
2、为当前用户添加环境变量
编辑当前用户的配置文件 ~/.bashrc
,并在末尾添加对应的环境变量命令,将对该用户永久生效
# 1. 打开当前用户配置文件
sudo vim ~/.bashrc
# 2. 在末尾添加环境变量路径,并保存退出
export LD_LIBRARY_PATH = $LD_LIBRARY_PATH: </home/projects/LinuxCpp_02_Lib/bin/x64/Debug>
# 3. 在shell中执行如下命令,让以上的修改立刻生效
source ~/.bashrc
方法三、将 .so 文件复制到系统库目录下
sudo cp <target.so> /usr/lib
【注意】当要查看一个可执行程序依赖的库信息,以及查找某个库或其它文件在当前系统上的位置时,可以使用如下的操作。
1. 查找可执行文件依赖库信息的命令:
ldd <target.out>
:该命令会列出可执行程序所依赖的共享库信息
2. 查找具体的文件在什么位置:
locate <file>
:该命令会列出查到的文件的绝对路径
【参考资料】
【linux】程序找不到动态库.so的解决办法|查看.so动态库信息|.so动态库加载顺序
一文读懂Linux下动态链接库版本管理及查找加载方式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2023-10-18 Qt 读写文件操作