我正在尝试编译链接到Sundown生成的共享库的示例程序。我正在编译这个程序。
$ gcc -o sd sundown.c -L. -lsundown
然而,当我运行它时,我收到以下错误。
./ sd:加载共享库时出错:libsundown.so:无法打开共享对象 file:没有这样的文件或目录
ls
的输出是。
$ ls
libsundown.so libsundown.so.1 sundown.c sd
为什么ld
找不到共享库?
答案 0 :(得分:6)
简短解决方案:
将.
(或-L
旗帜中的任何内容)添加到LD_LIBRARY_PATH
。当您运行sd
时,它将在标准位置和LD_LIBRARY_PATH中查找库。请注意,由于您已添加.
,因此仅当您从libsundown.so所在的同一目录运行sd
时,此方法才有效。
我打算分发已编译的二进制文件。如何在不强制人们编辑LD_LIBRARY_PATH的情况下分发库?
您应该在其中一个标准位置安装libsundown.so,例如/ usr / lib或/ usr / local / lib。你可以使用安装程序或make文件,或者像INSTALL或README这样简单的东西来告诉用户将库粘在那里,并确保将权限设置为合理的。
答案 1 :(得分:0)
在具有/ usr / lib和/ usr / lib64的Centos系统上,如果将64位库手动安装到/ usr / lib,则在运行时,该库可能不可见,即使在构建时就可见(我使用了自动工具,就可以从/ usr / lib找到我的zopfli库,而没有任何问题)。当我执行链接到/usr/lib/libzopfli.so.1的my_binary时,我得到了
libzopfli.so.1 => not found
将libzopfly.so.1从/ usr / lib移至/ usr / lib64后,一切正常。