如何使用install_name_tool在Mac OS X上部署Qt应用程序?

4
我有问题在打包我的Qt应用程序Mac OS X。
我已经阅读了在Mac OS X上部署应用程序的文档,但我仍然不确定我做错了什么。
在我的Mac上,我已经安装了Qt5,路径为~/Qt5.1.0/5.1.0/clang_64(这是bin/和lib/文件夹所在的位置)。
我有一个名为“renamer”的Qt应用程序,路径为~/Documents/QtProjects/renamer/。
使用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.app命令。macdeployqt运行良好,但当我重命名/删除Qt后,我的应用程序就不能运行了。我还在运行macdeployqt后运行了otool,但输出没有改变。我认为macdeployqt复制了必要的Qt库到应用程序包中,但没有正确更改查找qt库的位置。

1
今天早上我安装了Qt 5.1.1,并能够使用macdeployqt成功部署我的应用程序。现在,当我重命名/删除Qt时,我的应用程序仍然可以正常运行,没有任何问题。 - kimbaudi
1
我认为install_name_tool进行的是精确字符串匹配,因此如果您使用change但存在单个字符差异(如果它是路径,则无关紧要,例如//),则它将无法工作。 - Stefano Borini
1个回答

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 更容易 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接