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 = </home/projects/LinuxCpp_02_Lib/bin/x64/Debug>
2、为当前用户添加环境变量
编辑当前用户的配置文件 ~/.bashrc,并在末尾添加对应的环境变量命令,将对该用户永久生效
# 1. 打开当前用户配置文件
sudo vim ~/.bashrc
# 2. 在末尾添加环境变量路径,并保存退出
export 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下动态链接库版本管理及查找加载方式