qmake - QMAKE_RPATHDIR不起作用
qmake - QMAKE_RPATHDIR doesn't work
我有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引擎加载。
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 嵌套While循环不起作用(C++问题)
- C++Matching Brackets 2解决方案不起作用
- 为什么这段代码不起作用,我该如何解决?
- 我正在开发服务器,ip作为参数传递不起作用