首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >qmake - QMAKE_RPATHDIR不工作

qmake - QMAKE_RPATHDIR不工作
EN

Stack Overflow用户
提问于 2014-06-14 15:48:46
回答 3查看 4.8K关注 0票数 4

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

App.pro

代码语言:javascript
复制
.
.
else:mac: LIBS += -F$$OUT_PWD/Frameworks -framework library1
.
.

QMAKE_RPATHDIR += /usr/lib

首先,我告诉qmake,library1将驻留在它在框架目录中的包中(这没问题,链接就是成功)

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

代码语言:javascript
复制
otool -l app

没有出现任何LC_RPATH (我预计/usr/lib将有一个记录),如在这里Print rpath of executable on OSX

我真的需要设置我的开发环境(Qt 5,Mac,一个基本应用程序,一个核心库(这也将充当插件的SDK )和附加插件(共享库)。

错误仍然是:

代码语言:javascript
复制
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指令来解决)。

EN

回答 3

Stack Overflow用户

发布于 2014-08-27 22:55:52

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

代码语言:javascript
复制
QMAKE_LFLAGS_SONAME = -Wl,-install_name,@rpath/

那么在你的申请中,

代码语言:javascript
复制
osx:LIBS += -F$$OUT_PWD/Frameworks -framework library1
QMAKE_RPATHDIR += /usr/lib

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

代码语言:javascript
复制
myapp.app/Contents/Frameworks/library1.framework

在这种情况下,您可以将应用程序中的rpath设置得有点不同,如下所示:

代码语言:javascript
复制
QMAKE_RPATHDIR += @executable_path/../Frameworks
票数 6
EN

Stack Overflow用户

发布于 2016-02-24 21:24:42

添加

代码语言:javascript
复制
QMAKE_POST_LINK += install_name_tool -add_rpath <path to look in> $$TARGET

对于您的.pro文件--其中< path查找in>是您的框架或dylib驻留的路径。

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

代码语言:javascript
复制
QMAKE_POST_LINK += install_name_tool -add_rpath @executable_path $$TARGET
票数 0
EN

Stack Overflow用户

发布于 2018-03-23 14:16:21

在我的例子中,我有一个简单的dylib,而不是链接到我的可执行文件的框架。我已经有了以下几点:

代码语言:javascript
复制
LIBS += -L/path-to-mylibrary/ -lmylibrary
QMAKE_RPATHDIR += /path-to-mylibrary/

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

代码语言:javascript
复制
Load command 25
          cmd LC_RCPATH
      cmdsize 56
         name /path-to-mylibrary/ (offset 12)

但是,得到的可执行文件列出了库的LC_LOAD_DYLIB命令如下:

代码语言:javascript
复制
Load command 12
          cmd LC_LOAD_DYLIB
      cmdsize 48
         name libmylibrary.dylib (offset 24)

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

代码语言:javascript
复制
QMAKE_POST_LINK += install_name_tool -change libmylibrary.dylib @rpath/libmylibrary.dylib $$TARGET

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

代码语言:javascript
复制
Load command 12
          cmd LC_LOAD_DYLIB
      cmdsize 56
         name @rpath/libmylibrary.dylib (offset 24)

另外,我的库实际上是部署到/qt-install-root/qt-version/platform/qml/Mylibrary/中的qml插件,在其他项目中也是从QML引擎加载的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24221626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档