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