Linux上运行程序加载动态库失败
背景
在Linux上运行程序时,明明依赖的动态库就在对应的目录下,但是程序就是找不到。
[root@e3f935c5016b build]# ./xxxApp
./xxxApp: error while loading shared libraries: libsybdb.so.5: cannot open shared object file: No such file or directory
[root@e3f935c5016b build]# find / -name libsybdb.so.5
/usr/local/lib/libsybdb.so.5
[root@e3f935c5016b build]#
解决方法
加载不到动态库,原因肯定是系统不知道去哪里加载。此时需要告诉系统去哪个目录加载动态库。如果不告诉系统具体的目录,那么即使依赖动态库就在程序目录下,系统也不知道去哪里加载。
两种方式
1. 使用 export 和 LD_LIBRARY_PATH 环境变量
export LD_LIBRARY_PATH=/usr/lib64/:$LD_LIBRARY_PATH
LD_LIBRARY_PATH
是一个环境变量,用于指定动态链接器(ld.so)在运行时查找共享库(.so 文件)的额外路径。当程序运行时需要加载动态链接库(如 libsybdb.so.5),但默认路径(如 /usr/lib、/usr/local/lib)中找不到时,可以通过 LD_LIBRARY_PATH 指定额外的搜索路径。
比如:上面命令就是指定了/usr/lib64/
为额外的搜索路径。如果要指定多个路径,就写多条这样的语句就可以了。
如果在当前用户终端下执行这个命令,只是临时的,而且只对当前终端有效,如果要针对当前用户永久有效的话,可以将这些语句写到用户根目录下的 .bashrc
文件中,如下:
[root@e3f935c5016b build]# cat /root/.bashrc
# .bashrc# User specific aliases and functionsalias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'# Source global definitions
if [ -f /etc/bashrc ]; then. /etc/bashrc
fiexport LD_LIBRARY_PATH=/home/WiresharkLib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/home/WiresharkLib/LinuxL3:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/lib64/:$LD_LIBRARY_PATH
[root@e3f935c5016b build]#
这样的话,每次用这个用户登录时,终端会话就会调用这个文件执行,从而自动添加搜索路径。
2. 使用 ld.so.conf 和 ldconfig 命令 (推荐
)
直接将库路径加入系统配置中,就可以针对所有用户永久解决问题。
/etc/ld.so.conf
是 Linux 系统中 动态链接器(ld.so)的配置文件,用于指定系统在运行时查找共享库(.so 文件)的默认路径。当程序运行时需要加载动态链接库(如 libsybdb.so.5),系统会按照该文件中定义的路径顺序搜索库文件。
文件作用
- 定义系统级别的共享库搜索路径(优先级高于 LD_LIBRARY_PATH)。
- 通过 ldconfig 命令生成缓存(/etc/ld.so.cache),加速库文件的查找。
ld.so.conf
文件中的默认内容为:include /etc/ld.so.conf.d/*.conf
。可以将额外指定的目录直接写在此文件中,注意:一行一条目录
。也可以在 /etc/ld.so.conf.d/
目录下,新建一个自定义的 xxx.conf
配置文件,将需要指定的目录一行一条写在文件中。
[root@e3f935c5016b ld.so.conf.d]# cat /etc/ld.so.conf.d/libc.conf
/usr/local/lib
/usr/lib64/
/home/WiresharkLib
/home/WiresharkLib/LinuxL3
[root@e3f935c5016b ld.so.conf.d]#
上述代码解析:在目录 /etc/ld.so.conf.d/ 下,新建了一个 libc.conf 的文件,然后写入了四条额外指定的目录。
修改完毕后,使用 ldconfig
命令更新动态链接库目录缓存。这样才会生效。
本次分享完成,感谢查阅。