我在使用我的Mac应用程序部署Qt框架时遇到问题,我希望有些人能够知道为什么我会在干净的Mac上运行应用程序时出现此错误,而不是开发人员Mac。
OS: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
显然有些问题是因为QtXml是从/../Frameworks/../Frameworks引用的,它不存在。
这是设置:我有一个使用QtCore和QtXml的dylib(不是我选择的,但是现在我需要这两个框架),dylib用在NSBundle中,由主app加载,捆绑包位于资源文件夹中。复制文件构建阶段将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
然后将Qt框架移动到Contents / Frameworks,并将其install_name设置为:
@executable_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore
和QtXml @executable_path /../框架/ QtXml.framework /版本/ 4 / QtXml 参考QtCore: @executable_path /../框架/ QtCore.framework /版本/ 4.0 / QtCore
现在,当我在开发者mac上运行应用程序时,它显然可以正常安装Qt,但是当移动到干净的mac时,我会收到错误信息,可在Console应用程序中读取。 我试图将executable_path更改为loader_path,但这不起作用。 我不知道我做错了什么或为什么它不会,并且无法在谷歌上找到任何东西,当然我可能会看错了地方。有任何想法如何解决这个问题?
这是完整的错误消息:
MainApp:错误域= NSCocoaErrorDomain代码= 3587“捆绑包 无法加载“库”,因为它已损坏或丢失 必要的资源。“
(dlopen_preflight(/Users/someUser/Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle/ 内容/ MacOS / Library):未加载库:
@loader_path /../框架/ QtCore.framework /版本/ 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 = /用户/ SomeUser的/下载/ MainApp.app /内容/资源/库/ Library.bundle /内容/ MacOS的/图书馆, NSDebugDescription = dlopen_preflight(/用户/ SomeUser是否 /Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle/Contents/MacOS/Library): 库未加载: @loader_path /../框架/ QtCore.framework /版本/ 4.0 / QtCore
参考自: /Users/someUser/Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle/Contents/MacOS/../Frameworks/../Frameworks/QtXml.framework/Versions/4/QtXml 原因:图片未找到, NSBundlePath = /用户/ SomeUser的/下载/ MainApp.app /内容/资源/库/ Library.bundle, NSLocalizedDescription =无法加载包“库”,因为 它已损坏或缺少必要的资源。}
答案 0 :(得分:5)
在开发mac上,一切正常,因为安装了Qt库。但是,在您将应用程序发送到的任何Mac上,情况可能并非如此。 Qt套件附带了一个名为macdeployqt
的工具来解决这个问题。所以在终端中,在编译应用程序之后,执行以下操作:
# cd my-cool-app-Desktop
# macdeployqt my-cool-app.app
请注意,它也可用于创建.dmg文件,以便将所有内容一起发送:
# cd my-cool-app-Desktop
# macdeployqt my-cool-app.app -dmg
完成后,可以将.app目录或.dmg文件提供给没有安装Qt的其他人使用并按原样运行。
一个警告是,下次您尝试在开发人员计算机上运行它时,可能会抱怨安装了多个共享库。所以一旦你将其复制到其他地方以便分发它,删除整个.app目录并让qtcreator(或其他)重建它。
答案 1 :(得分:2)
<强>更新强>
如上所述,将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,在应用程序中链接它们,并对它们进行编码。
<强> OLD 强>
问题解决后,我将Qt框架移动到内容/框架中的应用程序包中,并使用otool将路径设置为@executable_path/../Frameworks
,即将其移出我的库包。是的,解决方案很简单,但我仍然不确定为什么库可执行文件在使用@loader_path时无法找到框架。
最好的解决方案可能是使用静态库而不是将其包装在一起...你每天都学习;)