Qt之程序发布以及打包成exe安装包

一、简述

Qt项目开发完成之后,需要打包发布程序,而因为用户电脑上没有Qt配置环境,所以需要将release生成的exe文件和所依赖的dll文件复制到一个文件夹中,然后再用 Inno Setup打包工具 打包成一个exe安装包,就可以发布了。


二、设置应用程序图标

我们编译好生成的exe文件的图标是Qt自带的一个白色的框框,不太好看,怎么能够自己设置程序的图标呢。先创建一个ico格式的文件,网上有很多在线就可以把png或jpg的图片转成ico格式的图标文件,然后把ico文件放到源代码目录下,就是.pro文件的同一文件夹下。

Qt_releaseIcon.png

在.pro项目文件中添加:

RC_ICONS = car.ico //这里的car.ico是我的ico文件的名字,改成你自己的ico文件名

添加完后一定要重新qmake一遍,然后再运行一遍你的程序,这样再看你的debug或者release文件夹下的exe文件就会有你设置好的图标了。

Qt_releaseIconExe.png


三、发布程序

发布程序首先要获得所依赖的dll文件,这里有两种方法。方法一就是去Qt安装目录的bin目录(笔者这里是F:\technology\Qt5.9.7\5.9.7\mingw53_32)中找所依赖的dll文件。方法二就是使用Qt自带的发布程序工具windeployqt.exe,可以生成所依赖的dll文件。这里着重讲解第二种方法,步骤如下:

(1)以 Release 方式编译生成 exe 程序,也就是调试运行的方式选择Release

Qt_releaseBuild.png

运行成功后,如果勾选了“shadow build”将源码路径和构建路径分开,那么将在 build-cleanRobot-Desktop_Qt_5_9_7_MinGW_32bit-Release 文件夹下生成exe文件,如下图1所示; 否则在源码工程目录下的 release 文件夹下生成exe文件,如下图2所示。

Qt_releaseFolder.png

Qt_releaseFolder2.png

将 cleanRobot.exe 可执行文件复制到别的文件夹下,这里我复制到F:\cleanRobot下,然后在 “开始菜单Qt5.9.7” 下找到 “Qt 5.9.7 for Desktop cmd”运行文件,打开运行。

Qt_releaseMinGW.png

执行cd F:\cleanRobot命令进入exe文件所在目录下, 再执行dir命令查看目录,最后执行windeployqt cleanRobot.exe命令,Qt就会自动把该程序所需要的所有dll拷贝过来。

Qt_releaseGetDll.png

当然有可能有些dll不是我们需要的,例如下面的D3Dcompiler_47.dll,为了使发布程序尽可能的小,可以把这些dll一个一个删掉,再打开exe程序,看哪些dll是删掉后就打开不了程序的,保留下来,剩下的删除即可。

再将自带文件夹,例如下图的image文件夹复制过来,删掉不必要的dll之后的exe安装包文件夹如下图所示。

Qt_releaseExeFolder1.png

其实到这一步,就可以将整个文件夹发布出去了,但如果想打包成一个exe安装包,就要进行下面的步骤了。


四、打包程序

官方下载地址:http://www.jrsoftware.org/isdl.php#stable

下载后直接安装即可。

项目开发完成之后,需要打包程序发行,可以使用 Inno Setup 软件制作安装exe。以下详细讲解如何打包应用程序:

(1)打开Inno Setup Complier,点击 “文件”—>“新建”,新建一个脚本向导程序;然后点击“next”

img

(2)在应用程序信息中输入“应用程序名称”、“应用程序版本”、“应用程序发布者”、“应用程序网站”,这些信息会自动在脚本中生成;然后点击下一步

img

(3)自定义打包文件的的输出地址以及输出文件夹的名称;然后点击下一步

img

(4)选择应用程序的主执行文件,也就是你编译生成的exe文件,下面点击“Add folder ”,把所有你的程序运行需要的dll和资源以及配置文件放在一个文件夹里,选择这个文件夹;然后点击下一步

img

注:Add folder 添加.exe的父文件夹,将依赖的dll等文件全部包含在内。

(5)输入应用程序在开始菜单中显示的名字,需要哪些功能,在前边打上对勾,一般默认即可;然后点击下一步

img

(6)这里可以选择“许可文件”,“安装前的文件”(如Readme文件等),“安装后显示信息”等;然后点击下一步

img

(7)选择安装语言;然后点击下一步

img

(8)选择“自定义编译器输出文件夹”、“编译器输出基本文件名”、“自定义的安装程序图标文件”及“安装密码”;然后点击下一步

img

注:第一个选项表示的是生成的 安装包*.exe 的输出目录。icon文件是 安装包*.exe 的图标文件。

(9)在这里选择是否使用#define编译指令,选择yes也就是在生成的脚本里使用#define宏定义一些常量,方便脚本编写,勾不勾选随意;然后点击下一步

img

img

前面最后一步中间会询问你是否立即编译新的脚本,这个脚本是根据刚才我们前面填写的那些内容自动生成的。可以直接使用编译,也可以自己重新编写,下面贴出生成的脚本代码。

; 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文件即可进行安装,如下图所示。

Qt_releaseFinalExe.png


参考:

Qt使用自带的windeployqt 生成exe来发布软件

QT 程序发布以及用Inno Setup打包成安装包

使用Inno Setup Compiler制作安装软件包

转载于:https://www.cnblogs.com/linuxAndMcu/p/10974927.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Nginx+WordPress搭建个人网站

背景 很多研究技术的朋友喜欢写博客。如果希望搭建一个完全属于自己的网站,也并不困难。这里简要分享一下我搭建这个博客网站的经验。 关键步骤 购买服务器、域名、DNS云解析服务网站备案(可选)安装NginxWordPressMySQLPHP配置WordPress运行网…

高仿QQ即时聊天软件开发系列之三登录窗口用户选择下拉框

上一篇高仿QQ即时聊天软件开发系列之二登录窗口界面写了一个大概的布局和原理 这一篇详细说下拉框的实现原理 先上最终效果图 一开始其实只是想给下拉框加一个placeholder效果,让下拉框在未选择未输入时显示一个提示字符串。由于Background对ComboBox无效&#xff0…

RoRoWoBlog 开源博客系统介绍

萝萝窝个人博客开源项目 以Asp.net MVC 2.0 ADO.Net Entity Framework 4.0 Unity 2.0 MvcPager JQuery 等技术框架,开发的个人博客系统。 支持MetaWeblog接口 通过MetaWeblog接口,可以将您个人博客系统中的博文,直接同步到您其它网站的博…

JAVA 面试知识点

主要包括以下几个部分: Java 基础知识点Java 常见集合高并发编程(JUC 包)JVM 内存管理Java 8 知识点网络协议相关数据库相关MVC 框架相关大数据相关Linux 命令相关面试,是大家从学校走向社会的第一步。 互联网公司的校园招聘&…

sqlserver 导出mysql,sqlserver数据(表)导出到mysql

这里说明我的工具: Navicat Premium1 首先 navicat 连接到 sqlserver 数据库,也就是我要从这里导出那个 170 万条数据的表,然后选中表右键单击,选择导出向导2 然后选择文本文件,下一步3 核对下我们要导出的表&#xff…

MediatR 知多少 - 简书

MediatR 知多少 - 简书 原文:MediatR 知多少 - 简书引言 首先不用查字典了,词典查无此词。猜测是作者笔误将Mediator写成MediatR了。废话少说,转入正题。 先来简单了解下这个开源项目MediatR(作者Jimmy Bogard,也是开源项目AutoMa…

oracle数据库扩展目录,Oracle 扩充磁盘空间

Oracle 扩充磁盘空间环境:OS:Oracle Linux Server release 6.3DB:Oracle 11.2.0.4.0问题:根目录磁盘空间不足,还剩6.5G解决办法:扩容磁盘空间;由于安装操作系统时没有使用LVM,不能直接扩容根目录&#xff0…

使用ANT打包Android应用

大家好,今天来分享一下如何使用ANT打包Android应用。 通常我们习惯用eclipse来开发Android程序,它会自动帮我们打包当前的应用程序。如果在Navigator视图下,我们可以看到以下几个文件: 在上图中,com包放置的是我们的cl…

迷你飞信一出,LibFetion该挂了把

飞信确实是个好东西! 发短信不要钱 支持群发,这样发个通知什么的,可以轻松搞定 但是以前的飞信客户端太庞大了 好几十M呢 而且光大还多了很多没有用的功能 比如:什么飞信空间啊,网上营业厅,彩信&#xff0c…

Java设计模式(1)工厂模式(Factory模式)

工厂模式定义:提供创建对象的接口。 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。为什么工厂模式是如此常用?因为工厂模式就相当于…

cmd使用另一个Oracle的sid,(转发备用)Oracle SID在本机上已经存在,请指定一个不同的SID”的解决办法...

(转发备用)Oracle SID在本机上已经存在,请指定一个不同的SID”的解决办法(2014-04-30 10:57:17)1、 开始->设置->控制面板->管理工具->服务 停止所有Oracle服务。2、 开始&#xff0…

$Poj1952\ $洛谷$1687\ Buy\ Low,Buy\ Lower$ 线性$DP+$方案计数

Luogu Description 求一个长度为n的序列a的最长下降子序列的长度,以及这个长度的子序列种数,注意相同的几个子序列只能算作一个子序列. n<5000,a[i]不超过long范围 Sol 求最长下降子序列的长度: 1.f[i]表示以a[i]结尾的最长下降子序列长度 2.f[i]表示以i结尾的最长下降子序列…

JavaScript中的各种宽高以及位置总结

在javascript中操作dom节点让其运动的时候&#xff0c;常常会涉及到各种宽高以及位置坐标等概念&#xff0c;如果不能很好地理解这些属性所代表的意义&#xff0c;就不能理解js的运动原理&#xff0c;同时&#xff0c;由于这些属性概念较多&#xff0c;加上浏览器之间 实现方式…

MySQL 8.0索引合并

简介参考https://dev.mysql.com/doc/refman/8.0/en/index-merge-optimization.html#index-merge-intersection。索引合并是通过多个range类型的扫描并且合并它们的结果集来检索行的。仅合并来自单个表的索引扫描&#xff0c;而不是跨多个表的索引扫描。合并会产生底层扫描的三种…

linux开通80端口命令,Linux iptables开启80端口

Linux下安装好apache的时候访问IP 发现无法访问!以为安装失败了&#xff0c;于是测试apache 监听的端口80#netstat -lnt |grep 80tcp 0 0 :::80 :::* LISTEN安装成功了&#xff01;想到用本机telnet IP 80不通- - 但…

服务端配置实现AJAX跨域请求

2019独角兽企业重金招聘Python工程师标准>>> 一直以为AJAX跨域是无法逾越的鸿沟&#xff0c;最近发现原来在服务端可以通过发送header信息来允许AJAX跨域请求。 PHP代码示例&#xff1a; header(Access-Control-Allow-Origin:*); header(Access-Control-Allow-Hea…

【翻译】怎样使用css制作迷人的button

英文原文&#xff1a;How to make sexy buttons with css 作者&#xff1a;Alex 这是一个教程&#xff0c;作者Alex一步步地叫我们怎样使用css来制作一个迷人的按钮&#xff0c;看后觉得挺好&#xff0c;很想大家都看看&#xff0c;翻译的可能稍有不妥&#xff0c;望谅解…… 这…

Linux内核分析(三)----初识linux内存管理子系统

原文:Linux内核分析&#xff08;三&#xff09;----初识linux内存管理子系统Linux内核分析&#xff08;三&#xff09; 昨天我们对内核模块进行了简单的分析&#xff0c;今天为了让我们今后的分析没有太多障碍&#xff0c;我们今天先简单的分析一下linux的内存管理子系统&#…

linux常用高级命令,Linux常用高级文件操作命令

Linux常用高级文件操作命令 cat 查看文本#cat 文件名 打印文件内容到当前屏幕上#cat -n 文件名 显示行号#cat gt;Linux常用高级文件操作命令cat 查看文本#cat 文件名 打印文件内容到当前屏幕上#cat -n 文件名 显示行号#cat > a.txt 可以用这种方法修改或…

java高并发实战Netty+协程(Fiber)|系列1|事件驱动模式和零拷贝

今天开始写一些高并发实战系列。 本系列主要讲两大主流框架&#xff1a; Netty和Quasar(java纤程库) 先介绍netty吧&#xff0c;netty是业界比较成熟的高性能异步NIO框架。 简单来说&#xff0c;它就是对NIO2的封装&#xff0c;但提供了更好用&#xff0c;bug更少的API。 为什么…