Windows下打包Qt应用程序
在Qt Creator下用Release编译一遍程序,生成相应的exe文件。
在Qt Creator下编译好的Release下的exe 拷贝到一个新建的文件夹下面;在开始菜单搜索Qt,找到如图这个命令行程序(命令行程序的版本必须与你使用的编译器版本严格对应,否则打包出来的程序将无法正常运行),然后运行。
打开QT命令行,然后利用cd语句进入你拷贝的exe文件放在的文件夹下; 如:”cd C:\Users\Final\Desktop\XXX”,接着运行命令行语句:”windeployqt XXX.exe”(XXX.exe用你的exe文件名替代),然后文件夹下就会出现所有QT依赖。
然后将这个文件夹打包好就可以发布了。如果需要将所有的dll以及其他资源文件全部打包成一个exe,我们可以使用Engima Virtual Box这款软件进行打包。
MacOS下打包Qt应用程序
在Qt Creator下用Release编译一遍程序,生成相应的应用程序。
然后找到Qt安装目录下的macdeployqt,比如在我的安装目录下该文件在“/users/dxf/Qt5.9.0/clang_64/bin/”目录,其中Qt5.9.0以及clang_64分别代表Qt的版本和Qt使用的C++编译器,在使用macdeployqt的时候Qt版本以及使用的编译器必须和编译时使用的Qt库版本及编译器严格对应,否则程序运行阶段将会出现不可预知的问题。
将macdeployqt拖入终端中,然后将你的应用程序也拖入终端中,如图所示,执行相应的打包命令,我们的Qt应用程序的所有依赖的库就会被打入应用程序中了。
如果需要打包成MacOS下的dmg文件,只需在命令行后加上-dmg即可,如图所示。
在Windows下对打包的应用程序进行压缩
在对Qt应用程序进行打包之后,这时候就会看到Qt已经把需要用到的DLL都复制过来了。如果觉得这时候整个程序比较大的话,可以根据需要去掉一些东东:
- libEGL.dll,libGLESV2.dll这两个文件是ANGLE的文件,可以去掉。opengl32sw.dll是软件模拟OpenGL使用到的,除非用户的系统连DirectX支持都不完整——虚拟机环境就是这样——不然这个文件也完全没有用。 QtWidgets/C++程序都不用OpenGL,所以直接去掉即可。可在调用 windeployqt.exe时加”–no-angle”和”–no-opengl-sw”这两个参数。
- 如果没有使用svg的话,iconenginesqsvgicon.dll, imageformatsqsvg.dll,Qt5Svg.dll这三个文件也可以删掉。
- 如果没有对应用程序做国际化处理的话,translations里面的翻译文件也可以删掉。
- QML程序没有使用QtWidgets/C++,可以删掉Qt5Widgets.dll。
- 如果imageformats目录里面有几种图像格式没用上,也可以删掉。我自己通常把整个目录都删掉,Qt已经编译了png的支持,能读写程序包含的图标就够,其它格式不重要。
- qmltooling和Qt5Network.dll是用于QML调试用的,可以删掉。
经过以上裁剪,使用7zip压缩完以后,一个QtWidgets/C++的HelloWorld程序最终只剩下5.64M,一个 QtControls程序是5.86M, QtQuick程序还会更小一些。
通常情况下,只需要platforms\qwindows.dll、Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dll四个。Qt 5拆得那么散就是想解决这个问题。所以不要打包所有的dll,用到哪个就加哪个。
关于Qt版本对应用程序大小的影响
如果你用的Qt版本为Qt 5.x甚至Qt6.x,5.x和6.x增加了很多新特性的确大了一些。
如果只是写个小程序,不需要5.x的新特性,那么推荐Qt 4.7.x/4.8.x。
Qt适合三种场景:
- 必须跨平台项目
- 大项目,代码行数在30万+
- Qt铁杆粉的项目
这三种场景下,安装包大小都不是主要问题。
减小安装包的方法也很简单:自己编译Qt库。
在configure的时候去掉RTTI,异常,Qt3支持,优化选项用最小大小(性能差不了太多)。
如果你的程序真的很小,那么可以直接静态链接,这样就更小了。
MacOS下应用程序“XXX”不能打开
当MacOS下的应用程序在传输过程中有遇到过压缩的话,经常会遇到「应用程序“XXX”不能打开」的提示,这是由于应用经过压缩和解压之后,其中的可执行文件的权限被抹除,导致无法打开。下面以ScreenShot应用为例子,解决一下这个问题。
1、右击该应用,选择“显示包内容”。
2、依次打开“Content”、“MacOS”目录,找到ScreenShot文件,我们会发现这个文件变成了文本编辑文稿类型的文件,而实际上这个文件应该为Unix可执行文件,由于在压缩的过程中权限丢失,所以这个文件变成了类型不明的文件,导致应用无法打开。
3、打开终端,输入“chmod +x”,注意“chmod”和“+x”中间有个空格,然后再输入空格,将ScreenShot文件拖入终端,接着按回车键执行指令。“chmod +x ScreenShot”的意思就是给ScreenShot这个文件执行权限的意思。
4、执行完这条命令之后,ScreenShot就被成功给予了执行权限,变成了Unix执行文件,这时这个应用就可以正常运行了。