【问题标题】:Why is my shared library not found?为什么找不到我的共享库?
【发布时间】:2012-06-22 02:26:42
【问题描述】:

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

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

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

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

ls 的输出是。

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

为什么ld找不到共享库?

【问题讨论】:

  • . 添加到LD_LIBRARY_PATH 环境变量?
  • @JonLin 哇。那确实奏效了。但是为什么-L 标志不起作用?
  • -L 告诉 gcc 在哪里查找库以便它可以链接,而不是编译后的二进制文件
  • @JonLin 我计划分发已编译的二进制文件。如何在不强制人们编辑LD_LIBRARY_PATH 的情况下分发库?

标签: gcc shared-libraries ld


【解决方案1】:

短解:

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

我计划分发编译后的二进制文件。如何在不强制人们编辑其 LD_LIBRARY_PATH 的情况下分发库?

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

【讨论】:

  • 太棒了!感谢您的帮助,这让我困惑了好几天。 =P
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2020-10-31
    • 1970-01-01
    • 2012-07-27
    • 2016-12-26
    • 1970-01-01
    • 2014-06-13
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多