在Mac系统下发布Qt程序详细教程

来源:互联网 发布:淘宝裕伟专卖店女装 编辑:程序博客网 时间:2024/05/21 10:48

http://www.embed-net.com/thread-121-1-1.html

最近在Mac系统下用Qt写了个程序,现在要发布,搞了很久,终于搞定,下面记录下发布时候遇到的一些问题和一些经验

首先有以下几点需要注意:
1,你的程序是否包含了第三方库?比如我这次发布的程序,程序就调用了第三方库;
2,若没包含第三方库,在Mac下发布Qt程序还是很容易的,直接使用macdeployqt命令即可;

下面详细说明下:
1,使用macdeployqt打包程序,比如我编译后的程序名字叫Bootloader,那么我可以用如下命令:macdeployqt Bootloader.app,该命令执行后在程序输出目录就有个Bootloader.app文件,如果你没调用第三方库,那么应用程序对Qt的依赖库会自动打包到这个文件里面,把这个文件拷贝给别人就可以直接运行了,如果你想打包成dmg格式的文件,则可以使用:macdeployqt Bootloader.app -verbose=1 -dmg,该命令执行后就会在程序输出目录产生一个Bootloader.dmg的文件。
Qt技巧:如何在程序编译成功后自动执行这些命令?你只需要在Qt构建步骤里面添加自定义步骤即可,比如要执行macdeployqt Bootloader.app -verbose=1 -dmg命令,我们可以选择添加自定义步骤,然后命令填macdeployqt,参数填Bootloader.app -verbose=1 -dmg,如此即可实现编译完程序后自动执行该命令。
如图所示为我在Mac下添加的命令
 

2,由于我使用到了第三方库,macdeployqt可能不能找到第三方库,这样该命令也不会把这个第三方库打包到Bootloader.app里面,在其他没有这个第三方库的机器上运行可能就会提示找不到这个库而导致程序不能正常运行,因此我们需要拷贝第三方库到Bootloader.app里面,Bootloader.app本质上就是一个文件夹(按照windows系统的理解,不一定准确),我们可以看到Bootloader.app的目录组织结构,一般情况下如下图所示:
 
应用程序一般都是放到MacOS目录下面的,Mac下的程序和windows下的程序不一样,在windows下,一般只需要把第三方库(.dll的文件)放到程序目录即可,但是在Mac下却不行,我们可以用otool -L命令来查看程序依赖库,比如在这里我们使用otool -L Bootloader.app/Contents/MacOS/Bootloader 命令,输出如下信息:
Bootloader.app/Contents/MacOS/Bootloader:
    @executable_path/../Frameworks/libusb-0.1.4.dylib (compatibility version 9.0.0, current version 9.4.0)
    bin/Release/libGinkgo_Driver.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets (compatibility version 5.3.0, current version 5.3.1)
    @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui (compatibility version 5.3.0, current version 5.3.1)
    @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore (compatibility version 5.3.0, current version 5.3.1)
    /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)
其中libGinkgo_Driver.dylib即为我们所调用的第三方库,这个路径是不是感觉有点奇怪?不管他那么多了,我现在就想类似于windows这样,将这个库放到和可执行程序一个目录即可,所以我想把这个路径变为@executable_path/libGinkgo_Driver.dylib,这时候就需要使用到另外一个命令install_name_tool,这个命令也需要添加到Qt的自定义命令列表里面,添加方式同上,其完整命令为:

install_name_tool -change "bin/Release/libGinkgo_Driver.dylib" "@executable_path/libGinkgo_Driver.dylib" Bootloader.app/Contents/MacOS/Bootloader

----------------------------------------------------------------------------------

http://stackoverflow.com/questions/5522126/dyld-not-able-to-load-dylibs

If you needed to do a similar modification to one of the dependencies, you'd use:

install_name_tool -change oldpath newpath currentfile
------------------------------------------------------------------------------------------------------------这个命令的意思就是说将程序依赖的bin/Release/libGinkgo_Driver.dylib库更改为@executable_path/libGinkgo_Driver.dylib库,如此,Bootloader.app/Contents/MacOS/Bootloader这个程序运行的时候就会到当前目录寻找libGinkgo_Driver.dylib库,所以我们又需要把这个库拷贝到程序目录Bootloader.app/Contents/MacOS下面,这时候又要使用一个拷贝的命令了,用过linux的都应该知道是cp吧,完整命令如下:
cp ../Bootloader/lib/libGinkgo_Driver.dylib Bootloader.app/Contents/MacOS/
../Bootloader/lib/libGinkgo_Driver.dylib即为第三方库所在位置,Bootloader.app/Contents/MacOS/即为要拷贝的目的位置,当然这个命令也需要添加到Qt自定义命令列表下面。

这里还有一个小问题,因为libGinkgo_Driver.dylib这个库又调用了libusb-0.1.4.dylib库,我们用命令otool -L libGinkgo_Driver.dylib 得倒如下信息:
libGinkgo_Driver.dylib:
    bin/Release/libGinkgo_Driver.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/local/lib/libusb-0.1.4.dylib (compatibility version 9.0.0, current version 9.4.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)
由此可见,libGinkgo_Driver.dylib库需要依赖/usr/local/lib/libusb-0.1.4.dylib库,我又用上面的方法(install_name_tool 命令)将这个目录改成当前目录,所以我执行如下命令:
install_name_tool -change "/usr/local/lib/libusb-0.1.4.dylib" "@executable_path/libusb-0.1.4.dylib" ./bin/Release/libGinkgo_Driver.dylib
再次运行命令otool -L libGinkgo_Driver.dylib就输出如下信息了:
libGinkgo_Driver.dylib:
    bin/Release/libGinkgo_Driver.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/libusb-0.1.4.dylib (compatibility version 9.0.0, current version 9.4.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)

如此再将libusb-0.1.4.dylib库拷贝到程序目录即可,用cp命令,完整命令如下:
cp Bootloader.app/Contents/Frameworks/libusb-0.1.4.dylib Bootloader.app/Contents/MacOS/

我们再用命令hdiutil将Bootloader.app打包成dmg文件,完整命令如下:
hdiutil  create -format UDBZ -quiet -srcfolder Bootloader.app Ginkgo_Bootloader_Mac_v2.7.29.dmg

最后在程序目录就输出了Ginkgo_Bootloader_Mac_v2.7.29.dmg文件,这个就类似于windows下的程序安装包。

下图为Qt下的所有自定义步骤:
 
第一个命令生成.app程序包
第二个命令更改程序依赖库路径
第三,第四个命令拷贝程序依赖库到指定位置
第五个命令将.app程序包再压缩打包为dmg文件

参考链接:
http://qt-project.org/doc/qt-4.8/deployment-mac.html
http://www.cnblogs.com/E7868A/archive/2012/12/02/2798225.html
0 0
原创粉丝点击