【问题标题】:Deploying Qt Frameworks with Mac app and usage of otool使用 Mac 应用程序部署 Qt 框架和使用 otool
【发布时间】:2012-02-22 02:21:53
【问题描述】:

我在使用我的 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

显然有些问题,因为 QtXml 是从 /../Frameworks/../Frameworks 中引用的,但它不存在。

这是设置:我有一个使用 QtCore 和 QtXml 的 dylib(不是我选择的,但现在我需要这两个框架),dylib 用于由主应用程序加载的 NSBundle,捆绑包位于资源文件夹中。 dylib 由 Copy Files Build Phase 移动到文件夹 Contents/Frameworks 并使用 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/../Frameworks/QtXml.framework/Versions/4/QtXml 参考 QtCore: @executable_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore

现在,当我在开发者 mac 上运行应用程序时,它显然可以工作,因为安装了 Qt,但是当移动到干净的 mac 时,我收到错误消息,可在控制台应用程序中读取。 我尝试将 executable_path 更改为 loader_path,但这不起作用。 我不知道我做错了什么或为什么不会做错,并且无法在 Google 上找到任何内容,当然我可能看错了地方。任何想法如何解决这个问题?

这是整个错误消息:

MainApp: Error Domain=NSCocoaErrorDomain Code=3587 "捆绑包 “库”因损坏或丢失而无法加载 必要的资源。”
(dlopen_preflight(/Users/someUser/Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle/ 内容/MacOS/库):库未加载:
@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=捆绑包已损坏或缺少必要的 resources., 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/MacOS/../Frameworks/../Frameworks/QtXml.framework/Versions/4/QtXml 原因:找不到图片, NSBundlePath=/Users/someUser/Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle, NSLocalizedDescription=无法加载捆绑包“Library”,因为 它已损坏或缺少必要的资源。}

【问题讨论】:

    标签: macos qt deployment


    【解决方案1】:

    更新

    如前所述,将 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 编译为静态库,将它们链接到应用程序中,并对它们进行代码设计。

    问题已解决,我将 Qt 框架移到 Contents/Frameworks 中的应用程序包中,并使用 otool 将路径设置为 @executable_path/../Frameworks,即将它移出我的库包。是的,解决方案很简单,但我仍然不确定为什么库可执行文件在使用 @loader_path 时找不到框架。

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

    【讨论】:

      【解决方案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(或其他)重建它。

      【讨论】:

      • 谢谢,但它不是依赖于 Qt 的应用程序,而是我创建的 dylib,包含在应用程序使用的 NSBundle 中。如果我在主应用程序上使用 cmd,我会收到一些警告,抱怨它找不到任何外部 Qtframeworks,因为它不使用它。但是,它确实移动了一些。如果我在 NSbundle (cd /MacOS) 上运行 cmd,我会收到一条错误消息:错误:找不到“BundleName”的捆绑二进制文件,后跟错误列表,其中无法复制一些 Qt dylib。如果我在使用 Qt 框架的 dylib 上运行它也会发生同样的情况你知道我做错了什么吗?
      • 不,我没有遇到这种情况。我确信将正确的库复制到正确的位置的某些过程会起作用。但我还没有完成 my-library-links-to-Qt 的事情。
      • @WesHardaker 如果我们在项目中使用了外部库怎么办。怎么用?
      猜你喜欢
      • 2011-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      相关资源
      最近更新 更多