0

我正在尝试在 mac(OS X 10.6-10.9,Qt 4.8)上部署一个使用 Assistant 来显示帮助的 Qt 应用程序

QStringList args = "-collectionFile " + "my_help_file";
QString app = "path/"+"Assistant.app";
m_helpProcess->start(app, args);

我将 Assistant.app 放在 Resources 文件夹中。

由于我在未安装 qt 的系统上部署应用程序,因此我将所有 QT 依赖项放在 Contents/Frameworks 中,然后运行 ​​install_name_tool

# for QtCore:
install_name_tool -id @executable_path/../Frameworks/QtCore.framework/Version/QtCore.framework/Versions/4/QtCore xxx.app/Contents/Frameworks/QtCore.framework/Versions/4/QtCore
install_name_tool -change QtCore.framework/Versions/4/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore xxx.app/Contents/MacOs/xxx

install_name_tool -change QtCore.framework/Versions/4/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore xxx.app/Contents/Resources/Assistant.app/Contents/MacOS/Assistant

该应用程序得到它,它是功能性的,但助手没有......显然它是一个不同的级别。

我不想放置框架的多个副本......此外,我确信如果我这样做会有冲突......

没有捆绑包的呼叫助手不起作用......(我希望将可执行文件放在 xxx 可执行文件旁边)

因为我想我将框架的 id 设置为从@executable_path 向下的一个目录,所以我无法告诉帮助寻找其他地方......

如何将助手与框架正确链接?

注意:我尝试过:

# for QtCore:
install_name_tool -id @executable_path/../Frameworks/QtCore.framework/Version/QtCore.framework/Versions/4/QtCore xxx.app/Contents/Frameworks/QtCore.framework/Versions/4/QtCore
install_name_tool -change QtCore.framework/Versions/4/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore xxx.app/Contents/MacOs/xxx

install_name_tool -change QtCore.framework/Versions/4/QtCore @executable_path/../../../Frameworks/QtCore.framework/Versions/4/QtCore xxx.app/Contents/Resources/Assistant.app/Contents/MacOS/Assistant

没有找到库...我猜 id 必须与路径匹配...但是对于 lib 的单个实例,它不能...

我还尝试在助手将查看的位置创建到 Qt 库的符号链接(别名?)......它尝试过但失败了,抱怨文件格式错误。

更新以回答评论:

在资源文件夹中的助手包中的助手上运行 otool -L:

@executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore

助理找不到真正所在的图书馆

@executable_path/../../../Frameworks/QtCore.framework/Versions/4/QtCore 
4

1 回答 1

0

出乎意料的是,即使从 QT Creator 外部,助手也能正确打开。一旦我给了助手和资源文件的绝对路径。(我可以为 Assistant 可执行文件或整个捆绑包做到这一点)

我将可执行助手复制到与我的应用程序可执行文件相同的文件夹中。

当然,需要添加依赖库并将链接路径设置为@executable_path/../Frameworks,就像部署任何应用程序一样。(我只是手动完成的,而不是使用 macdeployqt,因为 macdeployqt 无法复制插件)

非常重要的是,需要获取 Assistant 所需的 sqldrivers 插件。而且......那是一个艰难的过程......也为框架上的插件设置依赖关系。

将助手放在自己的包中(在资源中)会很棒......但是 Qt 库依赖项仍在主包的资源中,以避免多次复制相同的库。我无法做到这一点。将 Qt 框架放在捆绑包之外不是一种选择,因为我不能依赖用户不删除项目或安装其他版本。

于 2014-11-18T15:58:02.903 回答