【问题标题】:linking libraries -rpath LD_LIBRARY_PATH链接库 -rpath LD_LIBRARY_PATH
【发布时间】:2009-10-29 06:42:42
【问题描述】:

我有一些需要与我的应用程序链接的第 3 方库和包含(我已将它们复制到此位置 /usr/ssd/include 和 /usr/ssd/lib)。我刚刚创建了一个测试应用程序,看看我是否可以链接好。但是,当我尝试运行我的应用程序时,我收到以下消息。

./app: error while loading shared libraries: libssdn.so: cannot open shared object file: No such file or directory

在命令行上我是这样编译的:

gcc -g -Wall -I/usr/ssd/include -L/usr/ssd/lib -lssdn test_app.c -o app

一切正常,因为我没有收到任何警告或错误。但是,当我尝试运行该应用程序时出现错误。

在 usr/ssd/lib 中,该库被称为 libssdn.so

我一直在寻找解决方案,我已经阅读了一些关于 -rpath、-Wl 和 LD_LIBRARY_PATH 的内容,但不确定它们是什么以及如何在编译时包含它们。

我使用的是 Ubuntu 9.04 Linux,

感谢您的建议,

【问题讨论】:

    标签: c


    【解决方案1】:

    测试将 /usr/ssd/lib 添加到您的 $LD_LIBRARY_PATH 是否有帮助:

    在外壳中:

    导出 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/ssd/lib

    如果这样可以解决问题,请将 /usr/ssd/lib 添加到 /etc/ld.so.conf 或运行

    使其永久化
    ldconfig -n /usr/ssd/lib

    【讨论】:

      【解决方案2】:

      我个人的偏好是不要将共享对象的位置烘焙到可执行文件中(这是 -rpath 会做的)。

      相反,您应该在运行时将 /usr/ssd/lib 添加到您的 LD_LIBRARY_PATH。假设您正在运行 bash 或类似 shell 的 bash,请执行以下操作:

      export LD_LIBRARY_PATH=/usr/ssd/lib:${LD_LIBRARY_PATH}
      

      一旦你这样做了,你就可以运行你的可执行文件了。

      【讨论】:

      • 您好,一切正常。但是,如果我要在另一台 linux 机器上运行我的应用程序。我会有同样的问题吗?抱歉,但我无法理解使用 -rpath 和 LD_LIBRARY_PATH 的不同之处。谢谢。
      • -rpath 本质上将 LD_LIBRARY_PATH 烘焙到程序本身中,因此您不必将其添加到 LD_LIBRARY_PATH。如果 每台 机器在同一位置都有库,则 -rpath 很好。但是如果你想在库位于不同路径的机器上运行你的程序,-rpath 不是要走的路。
      • @Samuel - -rpath 有几个特殊代码 $LIB 和 $ORIGIN 可以提供帮助。例如,如果您有 somedirectory/bin/binaryprog,您可以将其与 -rpath $ORIGIN/../lib 链接,即使 somedirectory 在编译/链接时未知,它也会从 somedirectory/lib/yourlibrary 中获取库。您可能需要指定 $$ORIGIN 或 \$$ORIGIN,具体取决于您设置工具链的方式,但只有一个 $ 应位于二进制文件的 RPATH 标头中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      • 2020-05-07
      • 2012-09-16
      • 2018-11-18
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      相关资源
      最近更新 更多