在Linux下运行程序,有时会遭遇如下错误:“error while loading shared libraries: XXXXXX: cannot open shared object file: No such file or directory”。
这种情况,要么是shared libraries缺失了,要么是系统找不到该文件。本文将讨论如何分析和解决这类问题。
1.两个命令
先介绍两个有用的命令:ldd和ldconfig。
ldd命令的man page描述如下:ldd prints the shared libraries required by each program or shared library specified on the command line.详见:。
ldconfig命令的描述较长,这里不赘述,详见:。
2.确认缺少的库文件
针对上述问题,我们可以借助ldd命令分析该可执行文件的库文件依赖情况。ldd会列出该可执行文件需要的共享库文件,以及这些共享库文件是否能找到。
针对找不到的共享库文件,我们首先要确认其是否存在。如果不存在,则要安装相应的库文件。如果在确认库文件存在的情况下,仍然有上述的错误,则说明是系统“看不到”库文件。
系统究竟“看”得到哪些库呢?我们可以通过“ldconfig -p”来打印出系统能发现的共享库文件。由于结果是相当多的,我们可以结合grep来做有针对性的查找,如“ldconfig -p|grep /usr/local/lib”,查看系统是否能发现“/usr/local/lib”目录下的库文件。
通过上面的步骤,如果确认系统没有发现相应的库文件,则应把库文件所在的目录“告诉”系统。方法有两个:1.设置环境变量“LD_LIBRARY_PATH”;2.修改配置文件“/etc/ld.so.conf”。前者是临时性的,重启后就没有了;后者是永久的。通常先用第一个方法试验一下,确认能解决问题,再用第二个方法固化。要说明的是:“/lib”和“/usr/lib”是系统默认的目录,无需显式添加的。
3.设置环境变量
命令“export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib”,是把“/usr/local/lib”目录下的共享库文件添加了系统的库文件路径中。把“/usr/local/lib”修改成所需的库文件目录即可,如有多个目录则通过冒号“:”分隔。
经过上述步骤,如果程序能正常运行,则说明库文件已经正确安装,只是没有把路径添加到系统。
4.修改配置文件“/etc/ld.so.conf”
修改配置文件非常简单,用文本编辑器(如vi)打开该文件,把库文件的目录直接添加进去即可,一行一个,如:
/usr/lib
/usr/local/lib
如果是Ubuntu 10.10,可能会发现该文件只有一句:“include /etc/ld.so.conf.d/*.conf”,显然,该文件包含了“/etc/ld.so.conf.d/”目录下的所有conf文件。那么,为了保持其结构,参照那些conf文件,建立自己的conf文件即可。
最后,执行命令:
ldconfig
该命令将重建“/etc/ld.so.cache”文件,系统真正“看得见”的是这个文件里的内容。执行完该命令之后,配置文件的修改才能生效。
此外,如果不幸地发现,配置文件里本来就已经存在所需的目录,而系统看不见,(自己编译安装的库可能会有这个问题。)那么,根据上述原理,执行ldconfig命令,重建“/etc/ld.so.cache”文件就能解决问题。
近日在编译安装一个库的时候,遇到了上面的问题,最终发现是没有执行ldconfig命令导致,故有此文。
如有错误,欢迎批评指正。谢谢!
阅读(1906) | 评论(0) | 转发(0) |