6

我正在尝试编译一个链接到Sundown生成的共享库的示例程序。我正在像这样编译程序。

$ gcc -o sd sundown.c -L. -lsundown

然而,当我运行它时,我收到以下错误。

./sd:加载共享库时出错:libsundown.so:无法打开共享对象文件:没有这样的文件或目录

的输出ls是。

$ ls
libsundown.so  libsundown.so.1  sundown.c  sd

为什么找不到共享库ld

4

2 回答 2

7

简短的解决方案:

.(或任何来自您的-L标志的内容)添加到您的LD_LIBRARY_PATH. 运行时sd,它会在标准位置和 LD_LIBRARY_PATH 中查找库。请注意,由于您已添加.,因此仅当您sd从 libsundown.so 所在的同一目录运行时才有效。

我计划分发编译后的二进制文件。我怎样才能在不强迫人们编辑他们的 LD_LIBRARY_PATH 的情况下分发库?

您应该将 libsundown.so 安装在标准位置之一,例如 /usr/lib 或 /usr/local/lib。您可以使用安装程序或 ma​​ke 文件,或者像 INSTALL 或 README 这样简单的东西来执行此操作,告诉用户将库粘贴在那里并确保权限设置为合理的。

于 2012-06-20T00:45:28.433 回答
0

在带有 /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 后,一切正常。

于 2020-10-06T02:10:25.320 回答