在Linux干活,不管是运维人员操作TOMCAT,APACHE,ZUUL, MQ,KAFAL等偶尔会遇到libxxxx.so 没有找到,这里的xxx是代词,而且给出了目录名字。
既是你找到了它,并把它拷贝到当前目录下也还是无效,真的会被气。。。
这是小仙在建行,修改验证脚本时遇到的。建行会把开发人员上线的SQL打包。我们解包后,到处修改参数,最后执行updatedb.sh就可以,然后就是各种备份,查找日志,一翻没有必要的重复操作。而且不同版本,涉及不同的数据库,经常晚上加班,多个版本轮回测,一不小心有一处没改回参数,就把数据库给搞乱了。我来了后不断专研updatedb.sh这个脚本,发现脚本套脚本,连套5层。数据库配置有加密的,需要OPENSSLTOOL工具进行解压。就是这工具报了liblnsth.so not found. 整了老久,没整好,放弃了!
最近写OCCI接口的C++程序,程序写好了,发布到别的ORACLE系统下。发现还是报错liblnsth.so not found. 得这坑绕不开!得盘它!
.SO 是什么鬼?
据说它是动态链接库,还叫共享库。动态链接库,小仙以前使用BCB工具开发WINDOWS桌面应用,经常看到动态链接库XXX.DLL。看来跟WINDOWS的DLL是一回事。可是WINDOWX下的.EXE如果找不到,只要你拷贝程序当前目录下,它就能调用了。
那么在LINUX 是如何寻找SO的呢?
1 一般 Linux 系统把 /lib/usr/lib,/usr/local/lib 作为默认的库搜索路径,所以使用这几个目录中的链接库文件可直接被搜索到。
2 修改/etc/so.ld.conf (这个需要ROOT权限,这次不讲它)
3 修改环境变量,在其中添加自己的路径
在环境变量中添加
动态链接库搜索路径:
export LD_LIBRARY_PATH=XXX:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$(pwd) #指在当前脚本或程序中找
静态链接库搜索路径:
export LIBRARY_PATH=XXX:$LIBRARY_PATH
可以在/etc/profile中完成(对所有用户生效),也可以在用户home目录下的.bashrc或.bash_profile中添加(针对某个用户生效),修改完后重新登录即生效。
如何知道一个可执行程序依赖哪些库 ?
ldd命令可以查看一个可执行程序依赖的共享库,
例如# ldd /bin/lnlibc.so.6
=> /lib/libc.so.6 (0×40021000)/lib/ld-linux.so.2
=> /lib/ld- linux.so.2 (0×40000000)