【问题标题】:How to deploy a Qt application on Mac OS X using install_name_tool?如何使用 install_name_tool 在 Mac OS X 上部署 Qt 应用程序?
【发布时间】:2013-08-28 21:07:37
【问题描述】:

我在为 Mac OS X 打包 Qt 应用程序时遇到问题。

我已阅读 Deploying an Application on Mac OS X 上的文档,但我仍然不确定我做错了什么。

在我的 Mac 上,我在 ~/Qt5.1.0/5.1.0/clang_64 上安装了 Qt5(这是 bin/ 和 lib/ 文件夹所在的位置)

我在 ~/Documents/QtProjects/renamer/ 上有一个名为“renamer”的 Qt 应用程序。

使用 Qt Creator,我在 ~/Documents/QtProjects/build-renamer-Desktop_Qt_5_1_0_clang_64bit-Release 上构建了我的应用程序的发布版本。 所以我做的第一件事是在我的应用程序上运行otool

$ cd ~/Documents/QtProjects/build-renamer-Desktop_Qt_5_1_0_clang_64bit-Release
$ otool -L renamer.app/Contents/MacOS/renamer

结果如下:

renamer.app/Contents/MacOS/renamer:
    /Users/paul/Qt5.1.0//5.1.0/clang_64/lib/QtWidgets.framework/Versions/5/QtWidgets (compatibility version 5.1.0, current version 5.1.0)
    /Users/paul/Qt5.1.0//5.1.0/clang_64/lib/QtGui.framework/Versions/5/QtGui (compatibility version 5.1.0, current version 5.1.0)
    /Users/paul/Qt5.1.0//5.1.0/clang_64/lib/QtCore.framework/Versions/5/QtCore (compatibility version 5.1.0, current version 5.1.0)
    /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL (compatibility version 1.0.0, current version 1.0.0)
    /System/Library/Frameworks/AGL.framework/Versions/A/AGL (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 56.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)

接下来我在 renamer.app 包中创建了一个 Frameworks 目录,并将 QtWidgets、QtGui 和 QtCore 框架复制到新目录中:

$ cd ~/Documents/QtProjects/build-renamer-Desktop_Qt_5_1_0_clang_64bit-Release
$ mkdir renamer.app/Contents/Frameworks
$ cp -R ~/Qt5.1.0/5.1.0/clang_64/lib/QtCore.framework renamer.app/Contents/Frameworks
$ cp -R ~/Qt5.1.0/5.1.0/clang_64/lib/QtGui.framework renamer.app/Contents/Frameworks
$ cp -R ~/Qt5.1.0/5.1.0/clang_64/lib/QtWidgets.framework renamer.app/Contents/Frameworks

然后我运行 install_name_tool 来设置 QtWidgets、QtGui 和 QtCore 框架的标识名称:

$ cd ~/Documents/QtProjects/build-renamer-Desktop_Qt_5_1_0_clang_64bit-Release
$ install_name_tool -id @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore "renamer.app/Contents/Frameworks/QtCore.framework/Versions/5/QtCore"
$ install_name_tool -id @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui "renamer.app/Contents/Frameworks/QtGui.framework/Versions/5/QtGui"
$ install_name_tool -id @executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets "renamer.app/Contents/Frameworks/QtWidgets.framework/Versions/5/QtWidgets"

然后我确保应用程序知道在哪里可以找到库:

$ cd ~/Documents/QtProjects/build-renamer-Desktop_Qt_5_1_0_clang_64bit-Release
$ install_name_tool -change /../Frameworks/QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore "renamer.app/Contents/MacOS/renamer"
$ install_name_tool -change /../Frameworks/QtGui.framework/Versions/5/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui "renamer.app/Contents/MacOS/renamer"
$ install_name_tool -change /../Frameworks/QtWidgets.framework/Versions/5/QtWidgets @executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets "renamer.app/Contents/MacOS/renamer"

最后,由于QtGui框架依赖于QtCore,而QtWidgets框架依赖于QtGui/QtCore,所以我也更改了QtGui和QtWidgets的引用:

$ install_name_tool -change /../Frameworks/QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore "renamer.app/Contents/Frameworks/QtGui.framework/Versions/5/QtGui"
$ install_name_tool -change /../Frameworks/QtGui.framework/Versions/5/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui "renamer.app/Contents/Frameworks/QtWidgets.framework/Versions/5/QtWidgets"
$ install_name_tool -change /../Frameworks/QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore "renamer.app/Contents/Frameworks/QtWidgets.framework/Versions/5/QtWidgets"

但是,当我之后再次运行 otool -L renamer.app/Contents/MacOS/renamer 时,没有任何变化,我得到的输出与以前相同:

renamer.app/Contents/MacOS/renamer:
    /Users/paul/Qt5.1.0//5.1.0/clang_64/lib/QtWidgets.framework/Versions/5/QtWidgets (compatibility version 5.1.0, current version 5.1.0)
    /Users/paul/Qt5.1.0//5.1.0/clang_64/lib/QtGui.framework/Versions/5/QtGui (compatibility version 5.1.0, current version 5.1.0)
    /Users/paul/Qt5.1.0//5.1.0/clang_64/lib/QtCore.framework/Versions/5/QtCore (compatibility version 5.1.0, current version 5.1.0)
    /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL (compatibility version 1.0.0, current version 1.0.0)
    /System/Library/Frameworks/AGL.framework/Versions/A/AGL (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 56.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)

我认为运行 otool -L renamer.app/Contents/MacOS/renamer 会将输出更改为新的 Qt 路径,但它仍然是一样的。我以为我遵循了所有步骤,但它不起作用。我错过了一步还是做错了什么?我能够毫无问题地在 Windows 上成功部署我的程序,但我在 Mac 上遇到了问题。如何使运行 otool 显示新设置的路径,以便从我的 renamer.app 包中查找 QtCore、QtGui 和 QtWidgets 框架?

我也尝试使用macdeployqt 来部署我的应用程序,但是当我重命名/删除安装在 ~/Qt5.1.0/5.1.0/clang_64 下的 Qt 库时,我的应用程序无法运行。在将 /bin 添加到我的 PATH 后,我在项目文件夹下尝试了命令 sudo macdeployqt renamer.appmacdeployqt 运行良好,但是当我重命名/删除 Qt 时,我的应用程序不再运行。在运行macdeployqt 之后,我也运行了otool,但输出没有改变。我认为macdeployqt 将必要的 Qt 库复制到应用程序包中,但没有正确更改查找 qt 库的位置。

【问题讨论】:

  • 我今天早上安装了 Qt 5.1.1 并且能够使用 macdeployqt 成功部署我的应用程序。现在,当我重命名/删除 Qt 时,我的应用程序仍然可以正常运行。
  • 我认为 install_name_tool 会进行精确的字符串匹配,因此如果您使用 change 但甚至存在单个字符差异(如果它是路径则无关紧要,就像您有 //)然后它不会工作

标签: macos qt deployment


【解决方案1】:

正如 stefano 在他的评论中指出的那样, install_name_tool 可能非常挑剔! 在调用 insall_name_tool 时,您正在使用 /../Frameworks/QtCore.framework/Versions/5/QtCore 之类的路径,而引用应该是 /Users/paul/Qt5.10/etc。 (正如otool -L所示) 然而,在 Qt 5.2 中使用 macdeployqt 要容易得多:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-01
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    相关资源
    最近更新 更多