Chinaunix首页 | 论坛 | 博客
  • 博客访问: 114160
  • 博文数量: 23
  • 博客积分: 975
  • 博客等级: 准尉
  • 技术积分: 262
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-19 00:54
文章分类
文章存档

2011年(2)

2010年(3)

2008年(18)

我的朋友

分类: LINUX

2011-02-21 21:21:17

在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) |
给主人留下些什么吧!~~