Ste*_*sen 9 deployment macos qt
我在使用我的Mac应用程序部署Qt框架时遇到了问题,我希望有些人会知道为什么我会在干净的Mac上运行应用程序时出现此错误,即不是开发人员Mac.
操作系统:10.7 .2并使用XCode
错误消息:
Library not loaded: @loader_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore
Referenced from:/Users/someUser/Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle/Contents/MacOS/../Frameworks/../Frameworks/QtXml.framework/Versions/4/QtXml
Run Code Online (Sandbox Code Playgroud)
显然有些问题是因为QtXml是从/../Frameworks/../Frameworks引用的,它不存在.
这是设置:我有一个使用QtCore和QtXml的dylib(不是我选择的,但是现在我需要这两个框架),dylib用在NSBundle中,由主app加载,bundle是位于资源文件夹中.复制文件构建阶段将dylib移动到文件夹内容/框架,并使用otool将install_name设置为(如http://doc.qt.digia.com/4.3/deployment-mac.html所述):
@loader_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore
@loader_path/../Frameworks/QtXml.framework/Versions/4/QtXml
Run Code Online (Sandbox Code Playgroud)
然后将Qt框架移动到Contents/Frameworks,并将其install_name设置为:
@executable_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore
Run Code Online (Sandbox Code Playgroud)
和参考QtCore的QtXml @executable_path /../ Frameworks/QtXml.framework/Versions/4/QtXml:@executable_path /../ Frameworks/QtCore.framework/Versions/4.0/QtCore
现在,当我在开发人员mac上运行应用程序时,它显然可以正常安装Qt,但是当移动到干净的mac时,我得到错误消息,可在控制台应用程序中读取.我试图将executable_path更改为loader_path,但这不起作用.我不知道我做错了什么或为什么它不会,并且无法在谷歌上找到任何东西,当然我可能会看错了地方.任何想法如何解决这个问题?
这是整个错误消息:
MainApp:错误域= NSCocoaErrorDomain代码= 3587"无法加载包"库",因为它已损坏或缺少必要的资源."
(dlopen_preflight(/Users/someUser/Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle/ Contents/MacOS/Library):未加载库:
@loader_path /../ Frameworks/QtCore.framework/Versions/4.0/QtCore参考自:/ Users/someUser/Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle/Contents/MacOS/../Frameworks/../Frameworks/QtXml.framework/Versions/4/QtXml原因:找不到图像)UserInfo = 0x107c5d5d0 {NSLocalizedFailureReason =捆绑包已损坏或缺少必要的资源.,NSLocalizedRecoverySuggestion =尝试重新安装捆绑包.,NSFilePath =/Users/someUser/Downloads/MainApp.app/Contents/Resources/Lib/Library. bundle/Contents/MacOS/Library,NSDebugDescription = dlopen_preflight(/ Users/someUser /Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle/Contents/MacOS/Library):未加载库:@loader_path /../ Frameworks/QtCore.framework/Versions/4.0/QtCore
参考自:/Users/someUser/Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle/Contents/Ma cOS /../框架/../框架/ QtXml.framework/Versions/4/QtXml原因:找不到图像,NSBundlePath =/Users/someUser/Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle, NSLocalizedDescription =无法加载捆绑包"库",因为它已损坏或缺少必要的资源.}
在开发mac上一切正常,因为安装了Qt库.但是,在您将应用程序发送到的任何Mac上,情况可能并非如此.Qt套件附带了一个工具macdeployqt来解决这个问题.所以在终端中,在编译应用程序之后,执行以下操作:
# cd my-cool-app-Desktop
# macdeployqt my-cool-app.app
Run Code Online (Sandbox Code Playgroud)
请注意,它还可以用于创建.dmg文件,以便将所有内容一起发送:
# cd my-cool-app-Desktop
# macdeployqt my-cool-app.app -dmg
Run Code Online (Sandbox Code Playgroud)
完成后,可以将.app目录或.dmg文件提供给没有安装Qt的其他人,以便像往常一样使用和运行.
需要注意的是,下次尝试在开发人员计算机上运行它时,可能会抱怨安装了多个共享库.所以一旦你将其复制到其他地方以便分发它,删除整个.app目录并让qtcreator(或其他)重建它.
更新
如前所述,将 QT 编译为静态库是正确的方法。随着 Mavericks (10.9) 的发布,我们还需要共同设计框架 ( http://furbo.org/2013/10/17/code-signing-and-mavericks/ ),而 QT4.8.5 存在一些问题 ( https://bugreports.qt-project.org/browse/QTBUG-32896)。即使采用了建议的修复方案,在干净的机器上运行应用程序时我仍然遇到一些问题。因此,我最终将 Qt5.2 编译为 staticlibs,将它们链接到应用程序中,并对它们进行协同设计。
老的
问题解决后,我将 Qt 框架移动到 Contents/Frameworks 中的应用程序包中,并使用 otool 将路径设置为@executable_path/../Frameworks,即将其从我的库包中移出。是的,解决方案很简单,但我仍然不确定为什么库可执行文件在使用 @loader_path 时找不到框架。
最好的解决方案可能是使用静态库而不是将其包装在捆绑包中......您每天都在学习;)
| 归档时间: |
|
| 查看次数: |
5176 次 |
| 最近记录: |