linux运行环境
首先可以用ldd命令查看程序到底会使用哪些动态库。如图所示显示/bin/ls程序动态库情况ldd /bin/ls;执行后会显示该程序依赖那些动态库,以及这些动态库在系统的路径。如果在默认的环境中找不到,则会显示not found。其实ldd是一个脚本,更多的ldd用法大家可以继续研究。
如果ldd提示动态库not found,那么这种情况下如果运行程序就会报错xxx.so找不到。程序加载动态库默认是从/lib , /usr/lib 等路径中搜索,从/etc/ld.so.conf中配置的路径搜索,以及从环境变量LD_LIBRARY_PATH中的路径中搜索。所以第一种解决方案是:修改/etc/ld.so.conf配置,添加搜索动态链接库的路径。修改后要运行ldconfig命令才会生效。
第二种解决方案是:配置LD_LIBRARY_PATH环境变量。比如要添加/home/xxx/lib 也作为动态库的搜索路径,则执行命令:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxx/lib要使这条命令每次打开终端都生效,我们可以在 ~/.bashrc 或者 ~/.bash_profile 中加入这条语句。修改后,关闭再重新进入终端才生效。
最后还有一种显示的指定调用动态库路径的方法,动态库的加载链接是通过ld.so.2这个动态库来完成的。我们可以显示的用它来指定要加载的动态库路径。比如:/lib/ld.so.2 -library-path /home/user /bin/ls调用/bin/ls程序时,指定使用/home/user下的动态链接库。
使用ld.so方式主要是为了更方便的解决系统基础库升级的问题。比如笔者这几天在centos6版本上运行以太坊钱包geth,提示libc.so版本太低。libc.so这个动态库是系统基础动态库,几乎所有的程序都会用到,要升级及其不易,而且还非常容易把系统搞死。这时可以把更高版本的动态库放到一个单独的路径,通过ld.so --library-path 路径 可执行程序 这样方式来调起程序!
如果要修改ld.so.conf一定要小心谨慎,因为修改后会影响整个系统的
修改ld.so.conf要执行ldconfig命令才会生效
修改LD_LIBRARY_PATH环境变量,要export使其生效才行