一、简述
Qt项目开发完成之后,需要打包发布程序,而因为用户电脑上没有Qt配置环境,所以需要将release生成的exe文件和所依赖的dll文件复制到一个文件夹中,然后再用 Inno Setup打包工具 打包成一个exe安装包,就可以发布了。
二、设置应用程序图标
我们编译好生成的exe文件的图标是Qt自带的一个白色的框框,不太好看,怎么能够自己设置程序的图标呢。先创建一个ico格式的文件,网上有很多在线就可以把png或jpg的图片转成ico格式的图标文件,然后把ico文件放到源代码目录下,就是.pro文件的同一文件夹下。
在.pro项目文件中添加:
RC_ICONS = car.ico //这里的car.ico是我的ico文件的名字,改成你自己的ico文件名
添加完后一定要重新qmake一遍,然后再运行一遍你的程序,这样再看你的debug或者release文件夹下的exe文件就会有你设置好的图标了。
三、发布程序
发布程序首先要获得所依赖的dll文件,这里有两种方法。方法一就是去Qt安装目录的bin目录(笔者这里是F:\technology\Qt5.9.7\5.9.7\mingw53_32)中找所依赖的dll文件。方法二就是使用Qt自带的发布程序工具windeployqt.exe,可以生成所依赖的dll文件。这里着重讲解第二种方法,步骤如下:
(1)以 Release 方式编译生成 exe 程序,也就是调试运行的方式选择Release。
运行成功后,如果勾选了“shadow build”将源码路径和构建路径分开,那么将在 build-cleanRobot-Desktop_Qt_5_9_7_MinGW_32bit-Release 文件夹下生成exe文件,如下图1所示; 否则在源码工程目录下的 release 文件夹下生成exe文件,如下图2所示。
将 cleanRobot.exe 可执行文件复制到别的文件夹下,这里我复制到F:\cleanRobot下,然后在 “开始菜单Qt5.9.7” 下找到 “Qt 5.9.7 for Desktop cmd”运行文件,打开运行。
执行cd F:\cleanRobot
命令进入exe文件所在目录下, 再执行dir
命令查看目录,最后执行windeployqt cleanRobot.exe
命令,Qt就会自动把该程序所需要的所有dll拷贝过来。
当然有可能有些dll不是我们需要的,例如下面的D3Dcompiler_47.dll,为了使发布程序尽可能的小,可以把这些dll一个一个删掉,再打开exe程序,看哪些dll是删掉后就打开不了程序的,保留下来,剩下的删除即可。
再将自带文件夹,例如下图的image文件夹复制过来,删掉不必要的dll之后的exe安装包文件夹如下图所示。
其实到这一步,就可以将整个文件夹发布出去了,但如果想打包成一个exe安装包,就要进行下面的步骤了。
四、打包程序
Inno Setup 是一个免费的 Windows 安装程序制作软件,小巧、简便、精美是其最大特点,支持pascal脚本,能快速制作出标准Windows2000风格的安装界面,足以完成一般安装任务。 |
官方下载地址:http://www.jrsoftware.org/isdl.php#stable
下载后直接安装即可。
项目开发完成之后,需要打包程序发行,可以使用 Inno Setup 软件制作安装exe。以下详细讲解如何打包应用程序:
(1)打开Inno Setup Complier,点击 “文件”—>“新建”,新建一个脚本向导程序;然后点击“next”
(2)在应用程序信息中输入“应用程序名称”、“应用程序版本”、“应用程序发布者”、“应用程序网站”,这些信息会自动在脚本中生成;然后点击下一步
(3)自定义打包文件的的输出地址以及输出文件夹的名称;然后点击下一步
(4)选择应用程序的主执行文件,也就是你编译生成的exe文件,下面点击“Add folder ”,把所有你的程序运行需要的dll和资源以及配置文件放在一个文件夹里,选择这个文件夹;然后点击下一步
注:Add folder 添加.exe的父文件夹,将依赖的dll等文件全部包含在内。
(5)输入应用程序在开始菜单中显示的名字,需要哪些功能,在前边打上对勾,一般默认即可;然后点击下一步
(6)这里可以选择“许可文件”,“安装前的文件”(如Readme文件等),“安装后显示信息”等;然后点击下一步
(7)选择安装语言;然后点击下一步
(8)选择“自定义编译器输出文件夹”、“编译器输出基本文件名”、“自定义的安装程序图标文件”及“安装密码”;然后点击下一步
注:第一个选项表示的是生成的 安装包*.exe 的输出目录。icon文件是 安装包*.exe 的图标文件。
(9)在这里选择是否使用#define编译指令,选择yes也就是在生成的脚本里使用#define宏定义一些常量,方便脚本编写,勾不勾选随意;然后点击下一步
前面最后一步中间会询问你是否立即编译新的脚本,这个脚本是根据刚才我们前面填写的那些内容自动生成的。可以直接使用编译,也可以自己重新编写,下面贴出生成的脚本代码。
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "红牌检测系统"
#define MyAppVersion "2.5"
#define MyAppPublisher "SHIOTC, Inc."
#define MyAppURL "http://www.shiotc.com/"
#define MyAppExeName "redplate_qt.exe"
[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{D21B4F6B-401E-4575-B6E1-612A9CA50D58}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName=D:/redplate_detection_v2.5
DefaultGroupName=redplate_detection_v2.5
OutputDir=E:\carriage_recognition\redplate_detection\qt\redplate_qt_svm2\x64\Release
OutputBaseFilename=redplate_detection_2.5
;SetupIconFile=E:\carriage_recognition\redplate_detection\qt\redplate_qt_svm2\x64\Release\ICON.ico
Password=123456
Compression=lzma
SolidCompression=yes
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Files]
Source: "E:\carriage_recognition\redplate_detection\qt\redplate_qt_svm2\x64\Release\redplate_qt.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "E:\carriage_recognition\redplate_detection\qt\redplate_qt_svm2\x64\Release\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
注:运行过程中出现错误,可以直接在脚本中进行修改。
最后就生成了exe安装包文件,点击打开exe文件即可进行安装,如下图所示。
参考: