背景介绍
开发程序是给别人用的,必然要掌握打包发布的方法
打包又分成几个层次
- 一个文件夹,除了主要的
.exe
可执行文件外,包含了所有运行所需要的.dll
文件和其他文件。
使用时,需要自己找到主体.exe
可执行文件运行,桌面快捷方式自己创建,开始菜单不会出现该程序,控制面板也不会列出该程序的名字,把整个文件夹删掉就是卸载。
有时我们把这样的打包结果,叫做“绿色版、“便携版”、“可移动版”,来无影去无痕,不需要安装就能使用,不必卸载就删的很干净。 - 单独一个
.exe
可执行文件,而且不是常见的setup.exe
,是这个程序的主体,实际上就是把上一条说的文件夹压缩成一个.exe
可执行文件,同样的绿色便携。 - 一个
setup.exe
安装包,安装之后桌面有快捷方式,开始菜单能看到,控制面板卸载程序也能看到,像个样子。
所以接下来就按照三种层次,递进介绍打包发布的方法,使用以下几种工具:
- Qt自带的
windeployqt
- 免费打包工具
Enigma Virtual Box
- 免费打包工具
Inno Setup
和Qt官方发布的安装包制作工具Qt Installer Framework
首先介绍windeployqt
一、 windeployqt在哪里
Qt5安装时,附带安装了很多组件,其中包括一个命令行形式运行的组件。没有统一名称,但作用类似Anaconda Prompt
或者其他软件附带的命令行形式组件,都是不需要手动添加环境变量就能运行该软件大部分功能的工具。
以Qt5.7.0为例,安装成功后在开始菜单可以找到Qt 5.7 for Desktop (MinGW 5.3.0 32 bit)
点击运行后,就是个cmd形式的工具,常用的基础命令都是一样使用
输入windeployqt
,显示如下信息,可以看到里面包含了简单的使用说明
二、 windeployqt怎么用
拢共分三步:
- 确定打包项目;
- 找到项目的可执行文件.exe
- 使用windeployqt打包
如果项目中涉及到Qt外第三方的.dll文件,则参考第四部分补充内容
以及第五部分介绍了更通用的开发环境配置方法
1. 项目
首先要有一个打包的对象,参考Qt5下载与安装(Windows版)第三部分QtCreator验证安装成功
,在示例中搜索选取官方例程linechart
打开项目后,切换到Release
模式,运行
运行失败找官方解决,不可能的好吧
2. 可执行文件.exe
项目打包的主要对象其实只有一个可执行文件.exe,所以项目准备好之后,做两件事:
- 找到可执行文件.exe
- 单独存放可执行文件
(1) 找到它
点击下方3 应用程序输出
,复制运行目录C:\Qt\Qt5.7.0\Examples\Qt-5.7\charts\build-linechart-Desktop_Qt_5_7_0_MinGW_32bit-Release\release
这个目录可以在项目设置里更改,改好了再运行一次就有了
打开资源管理器,在地址栏粘贴运行目录,看到刚刚实际运行的linechart.exe
此时可以尝试直接双击运行,会报错,很多错,接连不断的报错
没关系,不要慌,这很正常
- 这么多Qt相关的错误,是因为没有添加环境变量
在QtCreator里,不会找不到Qt自家的.dll
,但是单独运行就一定会这样了 - 另外一个
libgcc
啥的,不要紧,后面windeployqt会解决的。其实是mingw的小弟
(2) 孤立它
现在,把linechart.exe
复制出来,找个地方建个文件夹单独放好。
在上一级目录新建文件夹publish
,放在里面,就它一个
3. windeployqt
此时,再次打开Qt 5.7 for Desktop (MinGW 5.3.0 32 bit)
,开始打包。总共两步:
- 打包位置:找到上一步中可执行文件的存放路径
- 开始打包,执行命令即可。
(1) 先瞄准
将当前目录更改为上一步的publish
,输入下面的命令,回车运行
cd /d C:\Qt\Qt5.7.0\Examples\Qt-5.7\charts\build-linechart-Desktop_Qt_5_7_0_MinGW_32bit-Release\publish
这句命令其实就三个部分,用空格隔开
cd
:change directory,切换目录/d
:可以改变当前驱动器- 目标地址:就看想去哪了
官方说明:
(2) 再开枪
目录切换过来后,输入下面的命令,回车运行
Tips:后边的文件名,可以用Tab自动补全。无法补全则需要确认下路径是否正确,以及是否只有一个.exe
可执行文件
windeployqt linechart.exe
回头看publish
文件夹,多出了很多.dll
文件。再次双击运行linechart.exe
运行成功,打包完成,这个publish
文件夹就是打好的包包,可以发给小伙伴试试看
不过只能保证同样的系统环境可以顺利打包迁移,在Win7或者WinXP还需要进一步测试
4. 补充
前边使用的是官方例程,配合官方提供的打包工具完美实现打包功能
但是实际开发过程中,可能会用到第三方的.dll
,但是windeployqt
并不能找到所有非Qt的.dll
文件
因此这里以Qt5连接PostgreSQL10(Windows版)(二)中连接PostgreSQL的项目为例,演示如何补充第三方.dll
文件
- 首先,我们得到了一个在QtCreator可以正常运行的
HelloPg
项目(添加了PostgreSQL的环境变量)
- 切换为
Realease
模式,再次运行。找到运行目录,把.exe
复制到新建文件夹publish
中
- 打开
Qt 5.7 for Desktop (MinGW 5.3.0 32 bit)
,cd
切换目录windeployqt
打包程序,打包完成的publish
文件夹就是这样:
到这里为止,是与正常打包流程相同的三步走,双击运行HelloPg.exe
,成功无疑。
但是不要忘记,现在的顺利,是因为我们添加了PotgreSQL的环境变量。
可是项目打包后,要在别的系统使用,环境变量是指望不上的。就算用户愿意自行手动添加,也很难让没安装过PostgreSQL的用户临时安装。
因此,删除环境变量,补充缺失的第三方.dll
文件
- 打开环境变量,删除PostgreSQL的环境变量
C:\PostgreSQL\10\bin
,再次运行,报错
- 使用everything或资源管理器自带的搜索,找到
LIBPQ.dll
的位置,复制到publish
文件夹, - 再次运行,再根据报错寻找新的缺失
.dll
文件,直到可以正常运行
最终,共5个缺失的.dll
,都可以在PostgreSQL的bin
目录中找到
此时的publish
文件夹已经多出了这5个.dll
文件,HelloPg.exe
也可以脱离环境变量正常运行
至此,一个补充了第三方.dll
文件的打包过程就结束了。这个publish
文件夹就是打好的包包。
不过,由于这次打包的项目中,涉及连接数据库,而且连接的是本地数据库,即IP为127.0.0.1
,所以这个publish
文件夹还不能发给小伙伴尝试,否则连接错误,无法正常运行。
除非迁移的目标电脑按照相同的安装步骤配置了PostgreSQL的环境。
但是项目打包发布的过程就是这样了,这就是打包的第一层境界
5. 附加内容
此处内容与打包无关
前面为了找到第三方.dll
文件,删除了环境变量,那么HelloPg
项目在Qtcreator中,又回到了程序异常结束的状态
环境变量改来改去也挺麻烦,此时可以利用刚刚找到的5个.dll
文件,解决异常结束
根据前面的操作,很容易发现,程序异常结束
的原因,其实就是缺.dll
,那就把刚刚找到的.dll
文件,粘贴到运行目录即可
此时直接双击HelloPg
依然报错,这是必然的,因为Qt的环境变量仍然没有
但是回到QtCreator再次运行,不再有异常结束了,问题解决
记得把这几个.dll
文件单独存放,以后都用的上。