在写完QT程序打包发布可执行文件.exe时,发现体积着实有点太大了。一个普通的串口读写软件压缩后达到58M!!!解决方案如下:(删减后的可执行程序只有8M左右)
- 创建一个 dist 目录
- 把编译好的 qttest.exe 复制到 dist 目录。
- 打开 cmd.exe,cd 到 dist 目录
4.1 运行 c:\qt5\bin\windeployqt.exe qttest.exe 或者(windeployqt.exe –no-angle –no-opengl-sw qt_test.exe)
4.2 对于 QML 程序,需要指定 QML 目录: c:\qt5\bin\windeployqt.exe –qmldir d:\qttest qttest.exe
这时候就会看到 qt 已经把需要用到的 DLL 都复制过来了。我会在这个基础上再根据需要去掉一些东东:
- libEGL.dll, libGLESV2.dll 这两个文件是 ANGLE 的文件,可以去掉。opengl32sw.dll 是软件模拟 OpenGL,除非用户的系统连 DirectX 支持都不完整——虚拟机环境就是这样——不然这个文件也完全没有用。 QtWidgets/C++ 程序都不用 OpenGL,所以直接去掉即可。可在调用 windeployqt.exe 时加”–no-angle” 和 “–no-opengl-sw” 这两个参数。
- 如果没有使用 svg 的话,iconengines\qsvgicon.dll, imageformats\qsvg.dll, Qt5Svg.dll 这三个文件也可以删掉
- 如果没有国际化用户的话,translations 里面的翻译文件也可以删掉。
- QML 程序没有使用 QtWidgets/C++ 可以删掉 Qt5Widgets.dll //C++程序不可以删除!!
- 如果 imageformats 目录里面有几种图像格式没用上,也可以删掉。我自己通常把整个目录都删掉,Qt已经编译了 png 的支持,能读写程序包含的图标就够,其它格式不重要。
- qmltooling 和 Qt5Network.dll 是用于 QML 调试用的,可以删掉。
经过以上裁剪,使用 7zip 压缩完以后,一个 QtWidgets/C++ helloworld 程序最终只剩下 5.64M,一个 QtControls 程序是 5.86M, QtQuick 程序还会更小一些。