Qt5程序打包发布(Windows版)(一)

背景介绍

开发程序是给别人用的,必然要掌握打包发布的方法
打包又分成几个层次

  • 一个文件夹,除了主要的.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)
Qt5程序打包发布(Windows版)(一)_第1张图片
点击运行后,就是个cmd形式的工具,常用的基础命令都是一样使用
输入windeployqt,显示如下信息,可以看到里面包含了简单的使用说明
Qt5程序打包发布(Windows版)(一)_第2张图片

二、 windeployqt怎么用

拢共分三步:

  • 确定打包项目;
  • 找到项目的可执行文件.exe
  • 使用windeployqt打包

如果项目中涉及到Qt外第三方的.dll文件,则参考第四部分补充内容

以及第五部分介绍了更通用的开发环境配置方法

1. 项目

首先要有一个打包的对象,参考Qt5下载与安装(Windows版)第三部分QtCreator验证安装成功,在示例中搜索选取官方例程linechart
qc1
打开项目后,切换到Release模式,运行
Qt5程序打包发布(Windows版)(一)_第3张图片
运行失败找官方解决,不可能的好吧

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\releaseQt5程序打包发布(Windows版)(一)_第4张图片
这个目录可以在项目设置里更改,改好了再运行一次就有了
Qt5程序打包发布(Windows版)(一)_第5张图片
打开资源管理器,在地址栏粘贴运行目录,看到刚刚实际运行的linechart.exe
Qt5程序打包发布(Windows版)(一)_第6张图片
此时可以尝试直接双击运行,会报错,很多错,接连不断的报错
Qt5程序打包发布(Windows版)(一)_第7张图片
没关系,不要慌,这很正常

  • 这么多Qt相关的错误,是因为没有添加环境变量
    在QtCreator里,不会找不到Qt自家的.dll,但是单独运行就一定会这样了
  • 另外一个libgcc啥的,不要紧,后面windeployqt会解决的。其实是mingw的小弟

(2) 孤立它

现在,把linechart.exe复制出来,找个地方建个文件夹单独放好。
在上一级目录新建文件夹publish,放在里面,就它一个
Qt5程序打包发布(Windows版)(一)_第8张图片

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

Qt5程序打包发布(Windows版)(一)_第9张图片

这句命令其实就三个部分,用空格隔开

  • cd:change directory,切换目录
  • /d:可以改变当前驱动器
  • 目标地址:就看想去哪了

官方说明:
Qt5程序打包发布(Windows版)(一)_第10张图片

(2) 再开枪

目录切换过来后,输入下面的命令,回车运行
Tips:后边的文件名,可以用Tab自动补全。无法补全则需要确认下路径是否正确,以及是否只有一个.exe可执行文件

windeployqt linechart.exe

Qt5程序打包发布(Windows版)(一)_第11张图片
回头看publish文件夹,多出了很多.dll文件。再次双击运行linechart.exe
Qt5程序打包发布(Windows版)(一)_第12张图片
运行成功,打包完成,这个publish文件夹就是打好的包包,可以发给小伙伴试试看
不过只能保证同样的系统环境可以顺利打包迁移,在Win7或者WinXP还需要进一步测试


4. 补充

前边使用的是官方例程,配合官方提供的打包工具完美实现打包功能
但是实际开发过程中,可能会用到第三方的.dll,但是windeployqt并不能找到所有非Qt的.dll文件

因此这里以Qt5连接PostgreSQL10(Windows版)(二)中连接PostgreSQL的项目为例,演示如何补充第三方.dll文件

  • 首先,我们得到了一个在QtCreator可以正常运行的HelloPg项目(添加了PostgreSQL的环境变量)
    Qt5程序打包发布(Windows版)(一)_第13张图片
  • 切换为Realease模式,再次运行。找到运行目录,把.exe复制到新建文件夹publish
    Qt5程序打包发布(Windows版)(一)_第14张图片
  • 打开Qt 5.7 for Desktop (MinGW 5.3.0 32 bit)cd切换目录windeployqt打包程序,打包完成的publish文件夹就是这样:
    Qt5程序打包发布(Windows版)(一)_第15张图片

到这里为止,是与正常打包流程相同的三步走,双击运行HelloPg.exe,成功无疑。

但是不要忘记,现在的顺利,是因为我们添加了PotgreSQL的环境变量。
可是项目打包后,要在别的系统使用,环境变量是指望不上的。就算用户愿意自行手动添加,也很难让没安装过PostgreSQL的用户临时安装。

因此,删除环境变量,补充缺失的第三方.dll文件

  • 打开环境变量,删除PostgreSQL的环境变量C:\PostgreSQL\10\bin,再次运行,报错
    Qt5程序打包发布(Windows版)(一)_第16张图片
  • 使用everything或资源管理器自带的搜索,找到LIBPQ.dll的位置,复制到publish文件夹,libpqdll
  • 再次运行,再根据报错寻找新的缺失.dll文件,直到可以正常运行
    Qt5程序打包发布(Windows版)(一)_第17张图片

最终,共5个缺失的.dll,都可以在PostgreSQL的bin目录中找到
Qt5程序打包发布(Windows版)(一)_第18张图片
此时的publish文件夹已经多出了这5个.dll文件,HelloPg.exe也可以脱离环境变量正常运行
Qt5程序打包发布(Windows版)(一)_第19张图片
至此,一个补充了第三方.dll文件的打包过程就结束了。这个publish文件夹就是打好的包包。

不过,由于这次打包的项目中,涉及连接数据库,而且连接的是本地数据库,即IP为127.0.0.1,所以这个publish文件夹还不能发给小伙伴尝试,否则连接错误,无法正常运行。
除非迁移的目标电脑按照相同的安装步骤配置了PostgreSQL的环境。

但是项目打包发布的过程就是这样了,这就是打包的第一层境界


5. 附加内容

此处内容与打包无关

前面为了找到第三方.dll文件,删除了环境变量,那么HelloPg项目在Qtcreator中,又回到了程序异常结束的状态
Qt5程序打包发布(Windows版)(一)_第20张图片
环境变量改来改去也挺麻烦,此时可以利用刚刚找到的5个.dll文件,解决异常结束

根据前面的操作,很容易发现,程序异常结束的原因,其实就是缺.dll,那就把刚刚找到的.dll文件,粘贴到运行目录即可
Qt5程序打包发布(Windows版)(一)_第21张图片
此时直接双击HelloPg依然报错,这是必然的,因为Qt的环境变量仍然没有
但是回到QtCreator再次运行,不再有异常结束了,问题解决
记得把这几个.dll文件单独存放,以后都用的上。

参考文献

[1] QT5的程序打包发布(将QT5的工程项目打包成一个exe程序)

你可能感兴趣的:(Qt5程序打包发布(Windows版)(一))