【问题标题】:Linking is jacked up.. what is -rpath? MacOS X链接被顶起..什么是-rpath? macOS X
【发布时间】:2010-08-12 01:38:20
【问题描述】:

所以,我正在构建一个项目,它使用来自已编译库(.dylib 或 .so)的函数。我在适当的位置有头文件和库文件(这是 QtRoot 的所有部分,顺便说一句),但是当我尝试在 Xcode 中构建我的项目时,我得到一个调试器错误:

dyld:库未加载:@rpath/libRIO.so 引用自:/Users/paulthompson/Documents/Programming/Build Products/Debug/MacHeliosSim.app/Contents/MacOS/MacHeliosSim 原因:找不到图片 共享库应用加载规则全部 数据格式化程序暂时不可用,将在“继续”后重试。 (目前无法调用加载器,已锁定。)

现在,如果我从 Finder 打开它,构建的程序本身将运行得很好,但是每当我尝试从 Xcode 运行它时,它就会向我吐口水。这是什么 rpath 东西,为什么调试器找不到库,即使 Xcode 本身知道它们在哪里,而且显然从 Finder 运行的程序也可以找到它们?

【问题讨论】:

    标签: xcode qt linker dynamic-linking rpath


    【解决方案1】:

    http://en.wikipedia.org/wiki/Rpath_(linking)

    它是存储在二进制文件中的用于查找共享库的路径。 当您从 Finder 启动应用程序时,它可能是一个应用程序包?创建应用程序包时,共享库被复制到应用程序包中,捆绑库的路径成为相对路径。 (@executable_path/../Frameworks/foobar)。您是如何创建适用于 Finder 的版本的?

    上述错误是在链接时发生还是在从 xcode 启动应用程序时发生? (在后一种情况下,请尝试使用 DYLD_LIBRARY_PATH)

    此外,libRIO 的 .so 扩展名而不是 .dylib 看起来有点可疑。

    【讨论】:

    • 您错过了链接上的右括号。
    • 正确,它是一个 .app 包。但是,其中没有任何共享库,除非它们被包装到实际的二进制文件中。甚至没有框架目录......无论如何,.app 是通过从 Xcode 执行“构建”或“构建并运行”来创建的。在“build & go”的执行部分或者我从 Xcode 中选择运行时会出现错误。我认为 .so 实际上是指向 .dylib 的符号链接。我链接到的一些库文件是实际的 .so 文件,而其他的是 .dylib。我认为那里甚至有一些.a,但我可能错了。那么,我可能错过了一个
    • 我想我应该问,将这样的预编译库添加到项目中的正确方法是什么?我使用的方法是从另一个项目中拖放它们(由qmake生成,并显示相同的问题)。此外,该 wiki 文章相当简短。 rpath的细节能不能详细解释一下?
    • 这解释了 rpath 是什么,但未能解决如何解决问题。
    【解决方案2】:

    在链接阶段添加 rpath,就像这个(在 qt creator 中)示例:

    LIBS += -L/usr/local/root/lib -lGui -lCore -lCint -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree -lRint -lPostscript -lMatrix -lPhysics -lMathCore -lThread -lpthread -Wl,-rpath,/usr/local/root/lib -lm -ldl

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 2019-01-18
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      • 2018-05-24
      相关资源
      最近更新 更多