【问题标题】:How do I deploy Assistant with my app on Mac without deploying multiple copies of Qt Frameworks?如何在不部署多个 Qt 框架副本的情况下在 Mac 上使用我的应用程序部署 Assistant?
【发布时间】:2015-01-14 17:21:44
【问题描述】:

我正在尝试在 mac(OS X 10.6-10.9,Qt 4.8)上部署一个使用助手显示帮助的 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 

【问题讨论】:

  • 框架的ID只在链接时使用。动态加载器并不关心加载时它是什么。您的第二组install_name_tool 命令应该有效。你链接到-headerpad_max_install_names了吗?如果不是,可能是没有足够的空间来存储加载器命令中的新路径。在第二组命令之后,otool -L 应用于 Assistant.app 的可执行文件会显示什么?
  • @KenThomases 抱歉回复晚了,只是现在我才尝试更改它,因为我需要将助手称为应用程序是有原因的...所以我更新了问题并回答了您的问题题。我不知道我会把“-headerpad_max_install_names”链接选项放在哪里,这是一个 qmake 选项吗?
  • 如果“-headerpad_max_install_names”是一个 qmake 选项,那么我不能使用它,因为我没有构建 Assistant 应用程序,它带有 Qt...

标签: macos qt deployment assistant help-viewer


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多