【问题标题】:qmake - QMAKE_RPATHDIR doesn't workqmake - QMAKE_RPATHDIR 不起作用
【发布时间】:2025-12-10 16:40:01
【问题描述】:

我有 mac os x。我有应用程序,它需要使用共享库(mac 上的框架),它是作为单独的项目开发的,但同时也在 Qt 5 中。

App.pro

.
.
else:mac: LIBS += -F$$OUT_PWD/Frameworks -framework library1
.
.

QMAKE_RPATHDIR += /usr/lib

首先,我告诉 qmake,library1 将驻留在 Frameworks 目录中的捆绑包中(这没问题,链接成功)

其次,QMAKE_RPATHDIR 应该告诉 gcc 编译器,当找到应用程序的库时,它也应该查看 QMAKE_RPATHDIR 中的那些路径。我指定了/usr/lib,只是为了检查它是否可以工作,但是:

otool -l app

不显示任何LC_RPATH(我希望/usr/lib 会有一条记录),如这里Print rpath of executable on OSX

我真的需要设置我的开发环境(Qt 5、Mac OS X、一个基本应用程序、一个核心库(这也将充当插件的 SDK)和其他插件(也可以共享库)。

错误依旧:

dyld: Library not loaded: library1.framework/Versions/1/library1
  Referenced from: /Users/Krab/projects/qtProjects/build-rootProject-Desktop_Qt_5_3_0_clang_64bit-Release/app/app.app/Contents/MacOS/app
  Reason: image not found

这很明显,因为.pro 文件中的设置仅用于链接,并不能解决这些库的动态加载问题(应该由QMAKE_RPATHDIR 指令解决)。

【问题讨论】:

    标签: c++ macos qt qmake


    【解决方案1】:

    您需要使用正确的安装名称构建您的框架。例如:

    QMAKE_LFLAGS_SONAME = -Wl,-install_name,@rpath/
    

    然后在你的应用程序中,

    osx:LIBS += -F$$OUT_PWD/Frameworks -framework library1
    QMAKE_RPATHDIR += /usr/lib
    

    如果您生成的“library1”框架放置在 /usr/lib 中,那么您的应用程序应该可以正常加载。但是,几乎在所有情况下,您都希望将框架放置在应用程序包中,如下所示:

    myapp.app/Contents/Frameworks/library1.framework
    

    在这种情况下,您需要在应用程序中设置 rpath,如下所示:

    QMAKE_RPATHDIR += @executable_path/../Frameworks
    

    【讨论】:

    • QMAKE_RPATHDIR 并没有为我改变任何东西...尝试了绝对路径和可执行路径....它在框架中找不到 dylib...只有当我执行构建后 install_name_tool -add_rpath 时它工作......
    【解决方案2】:

    添加

    QMAKE_POST_LINK += install_name_tool -add_rpath <path to look in> $$TARGET
    

    到您的 .pro 文件 - 其中 是您的框架或 dylib 所在的路径。

    例如,如果您将框架放在可执行文件旁边,请使用

    QMAKE_POST_LINK += install_name_tool -add_rpath @executable_path $$TARGET
    

    【讨论】:

      【解决方案3】:

      就我而言,我有一个简单的 dylib,而不是链接到我的可执行文件的框架。我已经有了以下内容:

      LIBS += -L/path-to-mylibrary/ -lmylibrary
      QMAKE_RPATHDIR += /path-to-mylibrary/
      

      QMAKE_RPATHDIR 正在工作,因为我的可执行文件正确列出了LC_RPATH 命令(由otool -l myexecutable 获得):

      Load command 25
                cmd LC_RCPATH
            cmdsize 56
               name /path-to-mylibrary/ (offset 12)
      

      但是,我生成的可执行文件为我的库列出了 LC_LOAD_DYLIB 命令,如下所示:

      Load command 12
                cmd LC_LOAD_DYLIB
            cmdsize 48
               name libmylibrary.dylib (offset 24)
      

      根据this answer,我更新了LC_LOAD_DYLIB 命令以在查找dylib 时包含RPATH,方法是将以下内容添加到我的可执行应用程序的.pro 文件中:

      QMAKE_POST_LINK += install_name_tool -change libmylibrary.dylib @rpath/libmylibrary.dylib $$TARGET
      

      之后,我的可执行文件开始正确列出LC_LOAD_DYLIB 命令:

      Load command 12
                cmd LC_LOAD_DYLIB
            cmdsize 56
               name @rpath/libmylibrary.dylib (offset 24)
      

      附带说明一下,mylibrary 实际上是一个部署到/qt-install-root/qt-version/platform/qml/Mylibrary/ 中的 qml 插件,并且也是从其他项目中的 QML 引擎加载的。

      【讨论】: