多语言展示
当前在线:780今日阅读:176今日分享:34

程序运行时加载动态库失败怎么解决?

linux开发人员经常会碰到运行程序的时候,报错找不到.so文件。.so文件是动态链接库,程序一般默认从/lib,/usr/lib下面找动态链接库是否存在。如果要加载的动态链接库不在这些默认目录下,则需要修改系统配置来引导程序去寻找动态链接库。一般有两种方式,修改/etc/ld.so.conf配置或修改环境变量LD_LIBRARY_PATH。
工具/原料

linux运行环境

方法/步骤
1

首先可以用ldd命令查看程序到底会使用哪些动态库。如图所示显示/bin/ls程序动态库情况ldd /bin/ls;执行后会显示该程序依赖那些动态库,以及这些动态库在系统的路径。如果在默认的环境中找不到,则会显示not found。其实ldd是一个脚本,更多的ldd用法大家可以继续研究。

2

如果ldd提示动态库not found,那么这种情况下如果运行程序就会报错xxx.so找不到。程序加载动态库默认是从/lib , /usr/lib 等路径中搜索,从/etc/ld.so.conf中配置的路径搜索,以及从环境变量LD_LIBRARY_PATH中的路径中搜索。所以第一种解决方案是:修改/etc/ld.so.conf配置,添加搜索动态链接库的路径。修改后要运行ldconfig命令才会生效。

3

第二种解决方案是:配置LD_LIBRARY_PATH环境变量。比如要添加/home/xxx/lib 也作为动态库的搜索路径,则执行命令:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxx/lib要使这条命令每次打开终端都生效,我们可以在 ~/.bashrc 或者 ~/.bash_profile 中加入这条语句。修改后,关闭再重新进入终端才生效。

4

最后还有一种显示的指定调用动态库路径的方法,动态库的加载链接是通过ld.so.2这个动态库来完成的。我们可以显示的用它来指定要加载的动态库路径。比如:/lib/ld.so.2 -library-path /home/user /bin/ls调用/bin/ls程序时,指定使用/home/user下的动态链接库。

5

使用ld.so方式主要是为了更方便的解决系统基础库升级的问题。比如笔者这几天在centos6版本上运行以太坊钱包geth,提示libc.so版本太低。libc.so这个动态库是系统基础动态库,几乎所有的程序都会用到,要升级及其不易,而且还非常容易把系统搞死。这时可以把更高版本的动态库放到一个单独的路径,通过ld.so --library-path 路径 可执行程序 这样方式来调起程序!

注意事项
1

如果要修改ld.so.conf一定要小心谨慎,因为修改后会影响整个系统的

2

修改ld.so.conf要执行ldconfig命令才会生效

3

修改LD_LIBRARY_PATH环境变量,要export使其生效才行

推荐信息