(我想使这个问题尽可能的笼统,所以我将在标题中省略给我带来问题的库的名称。)
我有一个项目,对于该项目,我需要一个图书馆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。它工作正常,程序正常运行。但是我很失望,因为这意味着该库已“嵌入”程序中(抱歉,这里的术语错误:我只是一个学生)。
因此,我在堆栈溢出中寻找解决方案:这就是我发现的:加载共享库时出错:libnsd.so:无法打开共享库文件:没有这样的文件或目录
库是不同的,但是使用命令
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
我对其中包括有些困惑;如果它像CI中的#include一样工作,则应该在我的/etc/ld.so.conf文件中包含/ usr / local / lib。看来并非如此。
/etc/ld.so.conf
只能由读取ldconfig
,它使用它来填充动态加载程序缓存/etc/ld.so.cache
。如果你把库导入/usr/local/lib
和/usr/local/lib
包含在通过该机制的搜索路径,它只会变得可用(不设置LD_LIBRARY_PATH
)如果您运行ldconfig
第一。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句