运行 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
执行更新动态链接库缓存的命令,以保证新增加的共享库能够被系统识别。然后执行可执行程序将不会提示找不到共享库的错误。
【参考资料】
【linux】程序找不到动态库.so的解决办法|查看.so动态库信息|.so动态库加载顺序
一文读懂Linux下动态链接库版本管理及查找加载方式