运行时,无法链接到动态库?(error while loading shared libraries)

问题:运行错误

ubuntu@VM-16-9-ubuntu:~/pro/main$ ./main
./main: error while loading shared libraries: libelasticlient.so.2: cannot open shared object file: No such file or directory

这个错误表明 libelasticlient.so.2 动态库 在运行时找不到,尽管编译时可能已经正确链接了 ibelasticlient

1. 动态库不存在?

ubuntu@VM-16-9-ubuntu:~/pro/main$ find /usr -name "libelasticlient*" 2>/dev/null
/usr/local/lib/libelasticlient.so
/usr/local/lib/libelasticlient.so.2
/usr/local/lib/libelasticlient.so.2.1.0

由上面的查询结果可知动态库文件是存在的。

2. 链接的路径不知道?

程序链接的动态库的地址由 LD_LIBRARY_PATH环境变量控制。
使用下面的指令查看环境变量:

echo $LD_LIBRARY_PATH

运行 echo $LD_LIBRARY_PATH 返回空。
LD_LIBRARY_PATH 可能从未被设置过(默认情况下为空)。
动态库路径可能通过其他方式指定(如 /etc/ld.so.conf-Wl-rpath 编译选项)。
查看/etc/ld.so.conf 显示为让查看 /etc/ld.so.conf.d 目录下的文件。

ubuntu@VM-16-9-ubuntu:~/pro/main$ cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf
ubuntu@VM-16-9-ubuntu:~/pro/main$ cat /etc/ld.so.conf.d/libc.conf
libc default configuration
/usr/local/lib

表明是有这个路径的。

3. 动态库缓存未更新?

/etc/ld.so.conf.d/libc.conf 已经正确配置了 /usr/local/lib,且动态库文件(libelasticient.so*)确实存在于该路径下,但运行时仍报错 “找不到动态库”。这可能是由于动态库缓存未更新程序运行时的库搜索路径问题导致的。

使用下面的指令查看可执行动态库的依赖库的情况。

ubuntu@VM-16-9-ubuntu:~/pro/main$  ldd /usr/local/lib/libelasticlient.so
        linux-vdso.so.1 (0x00007ffd7c9a1000)
        libjsoncpp.so.19 => not found
        libcpr.so.1 => not found
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fa986606000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fa9865eb000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa9863f9000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa9862aa000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fa986815000)

libelasticlient.so 依赖的两个库 libjsoncpp.so.19libcpr.so.1 未被找到(not found),而其他依赖(如 libstdc++.so.6libc.so.6)已正确加载。

/usr/local/lib/ 下存在 libjsoncpp.so.19(从 ls 输出可以看到),但 ldd 仍然报错。

可能原因:

  • 动态库缓存未更新(ldconfig 未扫描 /usr/local/lib)。

使用下面的指令更新动态库缓存

sudo ldconfig

然后再查看:

ubuntu@VM-16-9-ubuntu:~/pro/main$ ldd /usr/local/lib/libelasticlient.so
        linux-vdso.so.1 (0x00007ffd6ed77000)
        libjsoncpp.so.19 => /usr/local/lib/libjsoncpp.so.19 (0x00007f735ccfe000)
        libcpr.so.1 => /usr/local/lib/libcpr.so.1 (0x00007f735cce2000)
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f735cb00000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f735cae5000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f735c8f3000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f735c7a4000)
        libcurl.so => /usr/local/lib/libcurl.so (0x00007f735c744000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f735cd64000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f735c721000)
        libssl.so.1.1 => /lib/x86_64-linux-gnu/libssl.so.1.1 (0x00007f735c68e000)
        libcrypto.so.1.1 => /lib/x86_64-linux-gnu/libcrypto.so.1.1 (0x00007f735c3b7000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f735c39b000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f735c393000)

问题解决了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值