辛亚平的博客专栏

解决程序开发过程中的 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 的权限如下:
image

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

经过排查,程序对动态链接库的引用设置正常,动态链接库所处目录和文件访问权限也正常。根据经验判断,猜测该问题的根源是系统对程序库的搜索目录设置出了问题。

问题解决

首先,通过 echo $LD_LIBRARY_PATH 命令查看当前用户的 LD_LIBRARY_PATH 系统变量:
image
可以看到当前用户的 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 问题依然存在:
image

继续分析:通过 ldd 命令查看程序所依赖的程序库的加载情况:
image
可以看到,其它的程序库都能够正确加载,唯独 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 问题被解决。见以下截图:
image

参考文献

posted on 2022-11-29 11:14  辛亚平  阅读(2733)  评论(0编辑  收藏  举报

导航