解决程序开发过程中的 cannot open shared object file 问题
解决程序开发过程中的 cannot open shared object file 问题
问题描述
在 Linux 环境下的 C 程序开发过程中,引入了自己编译的动态链接库,编译正常,但是在运行程序时遇到了如下错误:
./TelemDecoder.out: error while loading shared libraries: libiLog3.so: cannot open shared object file: No such file or directory
问题分析
我自行编译了 C 语言日志库 iLog3,将编译所得动态链接库 libiLog3.so 拷贝到了 /usr/local/lib/ 目录中。
通过 ls -al 命令查看 libiLog3.so 的权限如下:

程序开发环境中也已设置了相应的库依赖:


经过排查,程序对动态链接库的引用设置正常,动态链接库所处目录和文件访问权限也正常。根据经验判断,猜测该问题的根源是系统对程序库的搜索目录设置出了问题。
问题解决
首先,通过 echo $LD_LIBRARY_PATH 命令查看当前用户的 LD_LIBRARY_PATH 系统变量:

可以看到当前用户的 LD_LIBRARY_PATH 系统变量为空。所以现在对该系统变量进行设置:
export LD_LIBRARY_PATH=/usr/local/lib$:$LD_LIBRARY_PATH
source ~/.bashrc
再执行 echo $LD_LIBRARY_PATH 命令,可以看到当前用户的 LD_LIBRARY_PATH 系统变量已经被正确设置,然而程序运行时的 cannot open shared object file 问题依然存在:

继续分析:通过 ldd 命令查看程序所依赖的程序库的加载情况:

可以看到,其它的程序库都能够正确加载,唯独 libiLog3.so 的加载情况是:libiLog3.so => not found
好,现在我们执行关键的一步:通过 ldconfig 命令来建立程序库必要的链接。
ldconfig 命令的作用是:对配置文件 /etc/ld.so.conf 中定义的路径下的程序库重新建立必要的链接。其详细作用与用法参考官方文档:https://linux.die.net/man/8/ldconfig
执行 ldconfig 命令之后,程序运行的 cannot open shared object file 问题被解决。见以下截图:

在 Linux 环境下的 C 程序开发过程中,引入了自己编译的动态链接库,编译正常,但是在运行程序时遇到了 `cannot open shared object file` 问题。最终通过运行 `ldconfig` 命令重新建立程序库必要的链接,从而解决了这个问题。
浙公网安备 33010602011771号