首页 文章

使用Mac应用程序部署Qt框架并使用otool

提问于
浏览
8

我在使用我的Mac应用程序部署Qt框架时遇到了问题,我希望有些人能够清楚地知道为什么我会在干净的Mac上运行应用程序,即不是开发人员Mac .

操作系统:10.7 .2并使用XCode

Error msg:

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加载,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

然后将Qt框架移动到Contents / Frameworks,并将其install_name设置为:

@executable_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore

和参考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,但这不起作用 . 我不知道我做错了什么或为什么它不会,并且无法在谷歌上找到任何东西,当然我可能会看错了地方 . 任何想法如何解决这个问题?

This is the entire error message:

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 =无法加载捆绑包“库”,因为它已损坏或缺少必要的资源 . }

2 回答

  • 2

    在开发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(或其他)重建它 .

  • 5

    UPDATE

    如上所述,将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 .

    最好的解决方案可能是使用一个静态库,而不是将它包装成一个...你每天都学习;)

相关问题