【问题标题】:How to make macdeployqt change the library names inside QtWebEngineProcess.app when it copies over QtWebEngineCore framework复制QtWebEngineCore框架时如何使macdeployqt更改QtWebEngineProcess.app中的库名称
【发布时间】:2018-03-07 22:35:51
【问题描述】:

编辑:使用 Qt 5.9.1,与 Homebrew 一起安装

根据other question 中的评论,我们正在尝试使用macdeployqt 来准备基于 Qt 的应用程序的 OSX 捆绑包的分发。

这个工具正确地复制了包内的所有 Qt 依赖项(甚至是一些非 Qt 库)。它还会更改应用程序本身和复制的库中的依赖库名称。

它还成功复制了QtWebEngineCore.framework的Helpers文件夹中的QtWebEngineProcess.app。

 问题

一个问题是它没有改变依赖库的名称inside QtWebEngineProcess,所以bundle是不可重定位的(如QtWebEngineProcess所指其依赖库的绝对路径仅在开发机器上有效)。 尝试在“客户端”机器上运行该应用程序,会出现错误:

dyld:库未加载: /usr/local/Cellar/qt/5.9.1/lib/QtWebEngineCore.framework/Versions/5/QtWebEngineCore 引用自:Business.app/Contents/Frameworks/QtWebEngineCore.framework/Helpers/QtWebEngineProcess.app/Contents/MacOS/QtWebEngineProcess

我们尝试手动修复此应用程序,方法是编辑 QtWebEngineProcess 以将 Qt 库路径的绝对部分替换为 @loader_path/../../../../../../../../Frameworks/。

这只会将问题向前推进:现在 QtWebEngineProcess 似乎可以正确加载其依赖库,但依赖库本身无法再加载其依赖库,因为它们的安装名称以 @ 开头executable_path 和 QtWebEngineProcess 可执行文件位于与 Business 可执行文件不同的文件夹中。因此错误:

dyld:库未加载: @executable_path/../Frameworks/QtQuick.framework/Versions/5/QtQuick
引用自:Business.app/Contents/Frameworks/QtWebEngineCore.framework/Versions/5/QtWebEngineCore


ma​​cdeployqt 在涉及使用 Qt 的 Web 引擎的应用程序时是否损坏?

有没有办法让它工作而无需手动重新更改捆绑包中的所有 Qt 安装名称?

【问题讨论】:

  • 不确定它对您的情况也有帮助,但对于使用QtWebEngine 的应用程序,我首先运行macdeployqt,然后使用选项-add rpath @executable_path/../Frameworks <absolute path to app install dir>/MyApp.app/Contents/MacOS/MyApp 运行install_name_tool,其中MyApp.app 是名称应用程序包的名称,MyApp 是应用程序二进制文件的名称。
  • @Dmitry 遗憾的是,正如我们在第二个错误中看到的,Qt 库包含以@executable_path 开头的依赖Qt 库的安装名称,而不是@rpath(这是由macdeployqt 完成的) )。所以我想填充应用程序的 rpath 应该不会有什么不同。
  • 我可以看到您使用通过 Homebrew 安装的 Qt。你试过用官方的Qt安装包代替吗?
  • @Dmitry 这是一个有趣的建议。我暂时找到了一些讨厌的解决方法,但是官方 Qt 安装是一个需要调查的轨道,谢谢!
  • @AdN 您能否分享您的解决方法作为答案?我遇到了同样的问题。

标签: c++ macos qt qtwebengine macdeployqt


【解决方案1】:

到目前为止,macdeployqt 在本地机器上对我来说工作正常。 在 CI 上,您可能会遇到工件以某种方式被破坏的问题。

如果您使用cp -r 或zip 复制您的应用程序而没有-y 选项,则会发生这种情况,那么所有符号链接都将在应用程序内解析并且它将无法正常工作,因为会有很多QtWebEngineProcess 的副本。如果您签署应用程序,它也会破坏您的签名。

解决方案是改用 cp -a 和 zip -r -y - 最后一个对我有用,而不是使用插件插件。

【讨论】:

    【解决方案2】:

    根据 Dmitry 对原始问题的评论之一,我终于花时间测试了用于 OS X 的 Qt 5.9.1 的官方发行版,结果证明他是对的。带有 Qt 官方二进制文件的 macdeployqtdistributed 可以很好地处理 QtWebEngineProcess.app。

    随homebrew Qt 安装分发的此实用程序的版本是伪造的,至少在 5.9.1 中是伪造的

    【讨论】:

      【解决方案3】:

      我制作了以下脚本,它使用install_name_tool 修复了这些路径:

      #!/bin/bash
      set -x -e
      
      pushd MyApp.app/Contents/Frameworks/QtWebEngineCore.framework/Helpers/QtWebEngineProcess.app/Contents/MacOS
      
      for LIB in QtGui QtCore QtWebEngineCore QtQuick QtWebChannel QtQml QtNetwork QtPositioning
      do
          OLD_PATH=`otool -L QtWebEngineProcess | grep ${LIB} | cut -f 1 -d ' '`
          NEW_PATH="@loader_path/../../../../../../../${LIB}.framework/${LIB}"
          install_name_tool -change ${OLD_PATH} ${NEW_PATH} QtWebEngineProcess
      done
      
      popd
      

      注意${OLD_PATH} 用作install_name_tool 参数时缺少引号。这是因为OLD_PATH 的值在路径周围有一些额外的空白,不应保留这些空白。如果 Qt 是通过 Homebrew 安装的,那么缺少引号通常是无害的,因为这些路径不包含空格。但是,这可以改进。

      重要提示:此修复足以让 Simple Browser(来自 Qt 示例)运行。但在更高级的项目中,可能需要更多的摆弄。

      【讨论】:

        猜你喜欢
        • 2018-02-20
        • 1970-01-01
        • 1970-01-01
        • 2019-07-04
        • 2016-03-03
        • 2014-05-22
        • 1970-01-01
        • 2023-04-07
        • 2013-09-14
        相关资源
        最近更新 更多