qmake - QMAKE_RPATHDIR不起作用

qmake - QMAKE_RPATHDIR doesn't work

本文关键字:RPATHDIR 不起作用 QMAKE qmake      更新时间:2023-10-16

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

App.pro

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

首先,我告诉qmake, library1将驻留在框架目录下的bundle中(这没有问题,链接完成成功)

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

otool -l app

没有显示任何LC_RPATH(我期望/usr/lib有一条记录),如在这里打印OSX上可执行文件的路径

我真的需要设置我的开发环境(Qt 5, Mac OS X,一个基础应用程序,一个核心库(这也将作为插件的SDK)和额外的插件(共享库)。

ERROR is still:

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指令解决)。

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

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
在这种情况下,您将在应用程序中设置路径稍微不同,如下所示:
QMAKE_RPATHDIR += @executable_path/../Frameworks

添加

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

到你的。pro文件- where <>中要查找的路径是框架或dylib所在的路径。

例如,如果您将框架放在可执行文件旁边,请使用
QMAKE_POST_LINK += install_name_tool -add_rpath @executable_path $$TARGET

在我的例子中,我有一个简单的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)

根据这个答案,我通过在我的可执行应用程序的.pro文件中添加以下内容来更新LC_LOAD_DYLIB命令,以便在查找dylib时包含RPATH:

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引擎加载。