简介
编译时依赖库,如果编译通过了,说明库是存在的。但在运行时,也会出现找不到库的情况,这时程序是无法启动的:
./a.out: error while loading shared libraries: libboost_system.so.1.64.0: cannot open shared object file: No such file or directory
有两种方法可以解决这个问题。
LD_LIBRARY_PATH环境变量
LD_LIBRARY_PATH环境变量用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径。
注意:
- LD_LIBRARY_PATH中指定的路径会在系统默认路径之前进行查找。
- 这种方法主要处理临时的动态库加载,LD_LIBRARY_PATH环境变量修改后,只能是对当前的用户生效。
具体步骤:
- 首先找到动态库的路径:
sudo find / -name libboost_system.so
,如/usr/local/lib
- 在
~/.bashrc
文件添加:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
- 立即生效:
source ~/.bashrc
以上2,3步骤也可以在命令行直接执行:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
,这样只对当前终端有效。
此时,再次运行程序即可。
修改/etc/ld.so.conf配置文件
/etc/ld.so.conf
:记录了程序加载运行期间查找动态链接库时的路径。
注意:对所有用户生效。不是每种操作系统都有这个配置文件。
具体步骤:
- 找到动态库的路径
- 编辑
/etc/ld.so.conf
,把刚找到的路径添加到最后一行 - 立即生效:
sudo ldconfig -v
此时,再次运行程序即可。
创建动态库的软链接
该方法可以让所有用户生效,且简单易用
一般/usr/lib
都会是程序查找的默认路径,只要动态库在该目录下,程序就可正常启动。
既然这样,为什么不直接把动态库cp到/usr/lib
下呢?是可以的,但是这样只是临时的方法,且当动态库升级的时候,每次都要cp一下,不然使用的仍然是旧版本。
具体步骤:
- 找到动态库路径
- 创建动态库的软链接:
ln -s 刚找到的库 /usr/lib/库名
注意:
- 创建软连接的时候要用绝对路径,如果用相对路径,会导致只在当前路径有效,其他路径这个软连接就找不到了
- 版本升级时,软链接会自动链接到新版本
小结
本文共有三种方法解决程序运行时找不到动态库的方法,具体使用时:
- 临时测试程序时,直接设置LD_LIBRARY_PATH环境变量即可
- 安装新库时,需要把一个目录添加到动态库的查找路径,使用修改/etc/ld.so.conf配置文件的方式
- 有一个库需要多个程序使用,且会经常使用时,建议使用ln软链接