编辑:使用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安装名称?
答案 0 :(得分:0)
到目前为止,macdeployqt
在本地计算机上运行正常。
在CI上你可能会遇到这样的问题,即工件在某种程度上被破坏了。
如果您使用cp -r
复制应用程序或zip
而不使用-y
选项,那么会发生这种情况,然后所有符号链接都将在应用内部得到解决,并且无法使用,因为会有很多QtWebEngineProcess
的副本。如果您签署应用程序,它也会破坏您的签名。
解决方案是使用cp -a
和zip -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示例)运行。但是在更高级的项目中,可能需要更多摆弄。