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

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

(我想让这个问题尽可能的笼统,所以我将省略标题中给我带来问题的库的名称。)

我有一个项目,为此项目我需要一个图书馆xxx。因此,我下载了该库,并使用默认命令(./configure && make && make install && make clean)对其进行了编译-已记录了安装过程-并尝试了文档中给出的示例是否可以正常查看所有内容。我将代码复制并粘贴到.c文件中,并使用以下命令对其进行了编译:

1
gcc -o program program.c -lxxx

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

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

我想到的第一个解决方案是使用gcc选项-static。它工作正常,程序正常运行。但是我很失望,因为这意味着该库已被"嵌入"到程序中(抱歉,这里的术语错误:我只是一个学生)。

因此,我在Stack Overflow中寻找了一个解决方案:那就是我发现的结果:加载共享库时出错:libnsd.so:无法打开共享对象文件:没有这样的文件或目录

该库是不同的,但是使用命令

1
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文件中写入目录名称:

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

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

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

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

1
/usr/local/lib

我对其中包括有些困惑;如果它与C中的#include一样工作,则我的/etc/ld.so.conf文件中应包含/ usr / local / lib。似乎并非如此。


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