【问题标题】:macdeployqt and third party librariesmacdeployqt 和第三方库
【发布时间】:2010-05-11 10:40:14
【问题描述】:

我有一个应用程序项目,它依赖于我自己创建的几个共享库。根据 Qt 4.6 文档“在 Mac OSX 上部署应用程序”:

注意:如果你想要一个 3rd 方库 包含在您的申请中 捆绑,那么您必须添加一个明确的 该库的 lib 条目到您的 应用程序的 .pro 文件。除此以外, macdeployqt 工具不会复制 将第 3 方 .dylib 放入捆绑包中。

我已将 lib 条目添加到我的应用程序的 .pro 文件中,但是当我执行 macdeployqt 时,我编写的库不会被复制到包中。我的 .pro 文件中有以下内容:

LIBS += -L../Libraries -lMyLib

一切正常,只是当我尝试从包中运行时遇到问题,即“找不到图像”错误。

macdeployqt 中是否存在错误,或者我的 .pro 文件是否需要更多内容?

【问题讨论】:

    标签: qt deployment macdeployqt


    【解决方案1】:

    badcat 是正确的,Qt 4.6 文档对 ma​​cdeployqt 工具的可能性有一个严重夸大的看法。

    根据我的经验,macdeployqt 所做的唯一事情是:

    1. 将 Qt 库复制到 foo.app/Contents/Frameworks/ 目录下的应用程序包中
    2. 调整一个二进制文件的链接库,即 foo.app/Contents/MacOS/foo(必须与 app bundle 同名,即使您在 Info.plist 中提到了另一个二进制文件)

    因此,对于您要在应用程序包中部署的所有其他二进制文件和库,您必须执行以下操作:

    1. 运行 macdeployqt 以享受其有用但微不足道的好处

      macdeployqt <path_to_your_nascent_app_bundle>/foo.app

    2. 手动安装额外的库

      cp <original_library_path> foo.app/Contents/Frameworks/<lib_name>

    3. 找出每个二进制链接到哪些库。

      otool -L <binary_file_name>

    4. 更改二进制文件中的内部库路径

      install_name_tool -change <original_library_path> @executable_path/../Frameworks/<lib_name> <binary_file_name>

    我为我的应用程序编写了一个自动执行这些步骤的 perl 脚本,但它对我的特定环境来说有点过于具体,无法在此处发布。

    【讨论】:

    • +1 表示“与应用程序包同名”部分。我的 .app 名称中包含内部版本号,但二进制中没有。这似乎解决了我的一个问题。谢谢。
    • 将缺失的库复制到应用程序并在这些缺失的库上运行 install_name_toll 后,您是否再次运行 macdeployqt
    • @MistyD No. macdeployqt,至少在我写这个答案时它是如何工作的,对那些丢失的库没有任何作用。这就是您手动运行 install_name_tool 的原因。
    • @ChristopherBruns 你能看看stackoverflow.com/questions/35185147/…
    • 一个重要提示:如果macdeployqtFrameworks/ 目录中看到它无法识别的内容,它会非常嘈杂。如果您自己复制第三方库并更正其 RPATH,则可以放心地忽略这些错误。
    【解决方案2】:

    您无需担心手动部署第三方库。我正在向 Qt 上传一个补丁,它可以指定其他库搜索路径,以便 macdeployqt 工具找到第三方依赖项: https://codereview.qt-project.org/#change,47906

    在此之后会有另一个提交,将添加对第三方库部署的支持。

    【讨论】:

    • 这将是对 macdeployqt 的一个很好的补充。手动部署第 3 方库/框架很痛苦。
    • 我下载了这个并尝试构建它(qttools.pro,将我的 Qt 5.0.2 中的 qttools 文件夹替换为来自 git 的文件夹),但收到有关 qtNomakeTools 的错误,并且(在我将其注释掉之后) ) '项目没有顶级 .qmake.conf 文件'和Module version not specified。你能帮我让补丁工作吗?我在试图在 Mac 上部署时束手无策。我已经尝试过 Bruns 的方式,但它只会导致路径中的路径混乱。
    【解决方案3】:

    您是否检查了 .app 包以查看库是否真的不存在?

    如果是这样,我会假设 macdeployqt 中确实存在错误,或者它根本无法找到您正在链接的库。就我个人而言,我从未见过 macdeployqt 将任何需要的第三方库复制到包中。

    有趣的是 macdeployqt 从来没有直接使用 .pro 文件。它只是对生成的应用程序包做一些事情。在快速浏览文档后,Qt 4.7 documentation page 显然证明我是对的:

    注意:如果您希望将第 3 方库包含在您的应用程序包中,则必须在创建包后手动将该库复制到包中。

    我假设 4.6 文档中存在错误。对我来说,macdeployqt 从不 将任何库文件放在我的包中(当然除了 Qt* 文件)。

    我过去确实花了很多时间在这些东西上,最后编写了一个简单的小 (Python) 脚本,将所有内容打包到我的包中,根据需要更改库名称并将所有内容放在 .dmg 文件中自动命名。

    可能不是您想听到的,但它确实有效。 ;)

    【讨论】:

      【解决方案4】:

      https://github.com/auriamg/macdylibbundler

      dylibbundler 是一个小型命令行程序,旨在使捆绑 .dylib 尽可能简单。它会自动确定您的程序需要哪些 dylib,将这些库复制到应用程序包中,并修复它们和可执行文件以准备分发……所有这些都在终端上使用一个命令!如果您的程序使用具有依赖关系的插件,它也可以工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-01
        • 1970-01-01
        • 2017-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多