2017-11-10 187 views
1

(我想使这个问题尽可能的通用,所以我会省略名称图书馆,给了我标题问题。)程序错误:./program:错误而载入共享库:LIB <xxx>的.so:无法打开共享对象文件:没有这样的文件或目录

我有一个项目,并为该项目,我需要一个图书馆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 

是到了我的心是用-static gcc的选项的第一个解决方案。它运行良好,程序正常运行。但我感到失望,因为这意味着图书馆“嵌入”在程序中(抱歉在这里错误的术语:我只是一个学生)。

于是,我找了在堆栈溢出的解决方案:这是我的发现: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

你安装库后运行'rehash'吗? –

+0

该问题与C无关。 – alk

+0

[man ldconfig](https://linux.die.net/man/8/ldconfig) –

回答

3

/etc/ld.so.conf仅被ldconfig读取,其使用它来填充动态加载器高速缓存/etc/ld.so.cache。如果将库装入/usr/local/lib,并且/usr/local/lib包含在通过该机制的搜索路径中,则只有在首先运行ldconfig时,它才可以使用(不需要设置LD_LIBRARY_PATH)。

+0

嗨,对于迟到的回复感到抱歉,并且非常感谢您回复我的主题。我对ld.so.cache不了解......我会对此进行一些调查研究。无论如何,运行ldconfig已经解决了这个问题。所以,每当我在/ usr/local/lib中安装一个动态加载库时,我需要刷新缓存文件,不是吗? – LuxGiammi

+0

是的,建议在系统范围库安装后运行'ldconfig'。 –

相关问题