程序错误:./ program:加载共享库时出错:lib <xxx> .so:无法打开共享对象文件:没有这样的文件或目录

时间:2017-11-10 21:48:32

标签: linux gcc linker shared-libraries ld

(我想让这个问题尽可能通用,所以我会省略在标题中给我提问题的库的名称。)

我有一个项目,对于那个项目,我需要一个库xxx。所以我下载了该库,使用默认命令(./configure && make && make install && make clean)编译 - 安装过程已记录在案 - 如果文档中给出的示例能够查看是否所有内容都已正确设置,则尝试使用。我将代码复制并粘贴到.c文件中,并使用以下命令对其进行编译:

gcc -o program program.c -lxxx

gcc报告没有错误。但是,只要我运行该程序,就会发生以下错误:

 ./program: error while loading shared libraries: lib<xxx>.so: cannot open shared object file: No such file or directory

出现在我脑海中的第一个解决方案是使用gcc选项-static。它工作正常,程序运行正常。但我很失望,因为这意味着图书馆被“嵌入”在程序中(对不起这里的错误术语:我只是一名学生)。

所以,我在Stack Overflow中找到了一个解决方案:这就是我找到的:error while loading shared libraries: libnsd.so: cannot open shared object file: No such file or directory

库不同,但使用命令

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

工作得很好。实际上libxxx.so位于/ usr / local / lib中(仅使用ls /usr/local/lib | grep xxx找到)。线程建议的另一个永久性解​​决方案是在/etc/ld.so.conf文件中写入目录名:

sudo echo "/usr/local/lib" >> /etc/ld.so.conf
sudo ldconfig

这是棘手的一点:ld.so.conf文件包含以下行

include /etc/ld.so.conf.d/*.conf

并在目录/etc/ld.so.conf.d中有一个名为libc.conf的文件,其中包含该行

/usr/local/lib

我对此感到有点困惑;如果它像C中的#include一样工作,我的/etc/ld.so.conf文件中应该有/ usr / local / lib。看来情况并非如此。

1 个答案:

答案 0 :(得分:3)

/etc/ld.so.conf仅由ldconfig读取,/etc/ld.so.cache使用它来填充动态加载程序缓存/usr/local/lib。如果您将库放入/usr/local/lib并且LD_LIBRARY_PATH通过该机制包含在搜索路径中,则只有在您首先运行ldconfig时,它才会变为可用(不设置date_field = forms.DateField( widget=forms.SelectDateWidget(years, months, empty_label) )