2

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

在对这个其他问题发表评论之后,我们正在尝试使用macdeployqt来准备基于 Qt 的应用程序的 OSX 捆绑包的分发。

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

它还成功复制了QtWebEngineCore.frameworkHelpers文件夹中包含的QtWebEngineProcess.app

 问题

一个问题是它没有更改 QtWebEngineProcess 中的依赖库名称 因此捆绑包不可重定位(因为QtWebEngineProcess通过仅在开发机器上有效的绝对路径引用其依赖库)试图在“客户端”机器上运行该应用程序,因此会出现错误:

dyld:库未加载:/usr/local/Cellar/qt/5.9.1/lib/QtWebEngineCore.framework/Versions/5/QtWebEngineCore 引用自:Business.app/Contents/Frameworks/QtWebEngineCore.framework/Helpers/QtWebEngineProcess.app /内容/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


当涉及到使用 Qt 的 Web 引擎的应用程序时,macdeployqt是否损坏?

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

4

3 回答 3

1

在 Dmitry 对原始问题的评论之一之后,我终于花时间测试了用于 OS X 的 Qt 5.9.1 的官方发行版,结果证明他是对的。与 Qt的macdeployqt官方二进制文件一起分发的 QtWebEngineProcess.app 处理得很好。

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

于 2017-12-20T18:35:45.133 回答
0

我制作了以下脚本,它使用以下方法修复了这些路径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参数时缺少引号。这是因为 valueOLD_PATH的路径周围有一些额外的空格,这些空格不应该被保留。如果 Qt 是通过 Homebrew 安装的,那么缺少引号通常是无害的,因为这些路径不包含空格。但是,这可以改进。

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

于 2019-05-10T20:58:00.433 回答
0

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

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

解决方案是使用cp -aandzip -r -y代替 - 最后一个对我有用,而不是使用插件来处理工件。

于 2017-11-06T23:03:04.950 回答