(我想让这个问题尽可能通用,所以我会省略在标题中给我提问题的库的名称。)
我有一个项目,对于那个项目,我需要一个库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。看来情况并非如此。
答案 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)
)
)