如何在通过QtWebEngineCore框架

时间:2017-09-26 15:53:33

标签: c++ macos qt qtwebengine macdeployqt

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

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

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

它还成功复制 QtWebEngineCore.framework Helpers 文件夹中包含的 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/Contents/MacOS/QtWebEngineProcess

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

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

  

dyld:未加载库:   @executable_path /../框架/ QtQuick.framework /版本/ 5 / QtQuick
  参考自:Business.app/Contents/Frameworks/QtWebEngineCore.framework/Versions/5/QtWebEngineCore

对于使用Qt网络引擎的应用程序, macdeployqt 是否已损坏?

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

3 个答案:

答案 0 :(得分:0)

到目前为止,macdeployqt在本地计算机上运行正常。 在CI上你可能会遇到这样的问题,即工件在某种程度上被破坏了。

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

解决方案是使用cp -azip -r -y代替 - 最后一个适用于我,而不是使用插件来制作工件。

答案 1 :(得分:0)

根据德米特里对原始问题的评论之一,我终于花时间测试了OS X的官方发行版Qt 5.9.1,结果证明他是对的。与Qt的官方二进制文件一起分发的macdeployqt正好处理QtWebEngineProcess.app。

与Qt的homebrew安装一起发布的此实用程序的版本是虚假的,至少在5.9.1中

答案 2 :(得分: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周围没有引号。这是因为OLD_PATH的值在路径周围有一些多余的空格,不应保留这些空格。如果Qt是通过Homebrew安装的,则缺少引号通常是无害的,因为这些路径不包含空格。但是,可以对此进行改进。

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