Qt:Mac 上的链接框架:使用 rpath
Qt: Linking Framework on Mac: using rpath
我想用 Qt 创建一个自定义框架。我能够自己创建框架,但是 Qt 在 运行:
时找不到框架
dyld: Library not loaded: QSettingsDialog.framework/Versions/0/QSettingsDialog
Referenced from: /Users/sky/QtProjects/build-QSettingsDialog-Desktop_Qt_5_7_0_clang_64bit-Debug/Examples/SimpleExample/SimpleExample.app/Contents/MacOS/SimpleExample
Reason: image not found
原因很简单:二进制文件不知道去哪里找框架。
我在二进制文件上使用了 otool 并看到了这个:
otool -L Examples/SimpleExample/SimpleExample.app/Contents/MacOS/SimpleExample
Examples/SimpleExample/SimpleExample.app/Contents/MacOS/SimpleExample:
QSettingsDialog.framework/Versions/0/QSettingsDialog (compatibility version 0.1.0, current version 0.1.2)
@rpath/QtWidgets.framework/Versions/5/QtWidgets (compatibility version 5.7.0, current version 5.7.0)
@rpath/QtGui.framework/Versions/5/QtGui (compatibility version 5.7.0, current version 5.7.0)
@rpath/QtCore.framework/Versions/5/QtCore (compatibility version 5.7.0, current version 5.7.0)
/System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)
/System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/AGL.framework/Versions/A/AGL (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)
所以,我的问题如下(有关更多详细信息,请查看以下内容):
如何告诉 qmake 将我的库的路径设置为:
@rpath/QSettingsDialog.framework/Versions/0/QSettingsDialog (compatibility version 0.1.0, current version 0.1.2)
有没有办法用 qmake 做到这一点?我确实知道如何使用 install_name_tool
更改它,但我想将它直接添加到 .pro 文件中。
到目前为止我做了什么:
我修改了我的 pro 文件以更改为二进制文件的 rpath 以包含库在构建时所在的路径:
otool -l Examples/SimpleExample/SimpleExample.app/Contents/MacOS/SimpleExample
Load command 22
cmd LC_RPATH
cmdsize 136
path /Users/sky/QtProjects/build-QSettingsDialog-Desktop_Qt_5_7_0_clang_64bit-Debug/Examples/SimpleExample/../../QSettingsDialog (offset 12)
Load command 23
cmd LC_RPATH
cmdsize 48
path /Users/sky/Qt/5.7/clang_64/lib (offset 12)
这样我就可以简单地修改版本的 rpath 而无需使用 install_name_tool
。但是,为了让它起作用,我需要将第一行更改为:
@rpath/QSettingsDialog.framework/Versions/0/QSettingsDialog (compatibility version 0.1.0, current version 0.1.2)
在我的应用程序 pro 文件中,我指定了以下内容:
mac {
QMAKE_LFLAGS += -F$$OUT_PWD/../../QSettingsDialog/
QMAKE_LFLAGS += '-Wl,-rpath,\'$$OUT_PWD/../../QSettingsDialog\''
LIBS += -F$$OUT_PWD/../../QSettingsDialog/ -framework QSettingsDialog
}
最后遗漏的部分是如何添加@rpath/
。感谢您的帮助。
感谢@peppe 评论中的链接,我得以解决问题:
我必须添加
QMAKE_LFLAGS_SONAME = -Wl,-install_name,@rpath/
到库专业文件。这样 Qt 在创建对框架的引用时自动使用 @rpath/QSettingsDialog.framework/Versions/0/QSettingsDialog
。
我想用 Qt 创建一个自定义框架。我能够自己创建框架,但是 Qt 在 运行:
时找不到框架dyld: Library not loaded: QSettingsDialog.framework/Versions/0/QSettingsDialog
Referenced from: /Users/sky/QtProjects/build-QSettingsDialog-Desktop_Qt_5_7_0_clang_64bit-Debug/Examples/SimpleExample/SimpleExample.app/Contents/MacOS/SimpleExample
Reason: image not found
原因很简单:二进制文件不知道去哪里找框架。
我在二进制文件上使用了 otool 并看到了这个:
otool -L Examples/SimpleExample/SimpleExample.app/Contents/MacOS/SimpleExample
Examples/SimpleExample/SimpleExample.app/Contents/MacOS/SimpleExample:
QSettingsDialog.framework/Versions/0/QSettingsDialog (compatibility version 0.1.0, current version 0.1.2)
@rpath/QtWidgets.framework/Versions/5/QtWidgets (compatibility version 5.7.0, current version 5.7.0)
@rpath/QtGui.framework/Versions/5/QtGui (compatibility version 5.7.0, current version 5.7.0)
@rpath/QtCore.framework/Versions/5/QtCore (compatibility version 5.7.0, current version 5.7.0)
/System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)
/System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/AGL.framework/Versions/A/AGL (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)
所以,我的问题如下(有关更多详细信息,请查看以下内容): 如何告诉 qmake 将我的库的路径设置为:
@rpath/QSettingsDialog.framework/Versions/0/QSettingsDialog (compatibility version 0.1.0, current version 0.1.2)
有没有办法用 qmake 做到这一点?我确实知道如何使用 install_name_tool
更改它,但我想将它直接添加到 .pro 文件中。
到目前为止我做了什么:
我修改了我的 pro 文件以更改为二进制文件的 rpath 以包含库在构建时所在的路径:
otool -l Examples/SimpleExample/SimpleExample.app/Contents/MacOS/SimpleExample
Load command 22
cmd LC_RPATH
cmdsize 136
path /Users/sky/QtProjects/build-QSettingsDialog-Desktop_Qt_5_7_0_clang_64bit-Debug/Examples/SimpleExample/../../QSettingsDialog (offset 12)
Load command 23
cmd LC_RPATH
cmdsize 48
path /Users/sky/Qt/5.7/clang_64/lib (offset 12)
这样我就可以简单地修改版本的 rpath 而无需使用 install_name_tool
。但是,为了让它起作用,我需要将第一行更改为:
@rpath/QSettingsDialog.framework/Versions/0/QSettingsDialog (compatibility version 0.1.0, current version 0.1.2)
在我的应用程序 pro 文件中,我指定了以下内容:
mac {
QMAKE_LFLAGS += -F$$OUT_PWD/../../QSettingsDialog/
QMAKE_LFLAGS += '-Wl,-rpath,\'$$OUT_PWD/../../QSettingsDialog\''
LIBS += -F$$OUT_PWD/../../QSettingsDialog/ -framework QSettingsDialog
}
最后遗漏的部分是如何添加@rpath/
。感谢您的帮助。
感谢@peppe 评论中的链接,我得以解决问题:
我必须添加
QMAKE_LFLAGS_SONAME = -Wl,-install_name,@rpath/
到库专业文件。这样 Qt 在创建对框架的引用时自动使用 @rpath/QSettingsDialog.framework/Versions/0/QSettingsDialog
。