【QT 项目部署指南】使用 Inno Setup 打包 QT 程序为安装包(超详细图文教程)
一、为什么需要打包成安装包?
在完成 QT 项目开发后,直接发布可执行文件(.exe
)和依赖的 DLL 文件虽然可行,但存在以下问题:
- 用户体验差:用户需手动管理文件路径,容易因文件缺失导致程序崩溃。
- 权限管理难:无法自动创建开始菜单快捷方式、桌面图标或注册系统服务。
- 文件分散:动态库模式下大量 DLL 文件杂乱无章,静态库模式下可执行文件体积过大。
而使用 Inno Setup 打包成安装包可以完美解决这些问题:
- 自动创建安装向导,支持自定义安装路径、开始菜单条目等。
- 压缩文件体积,生成单一可执行安装程序(
.exe
)。 - 支持卸载功能,自动清理残留文件。
二、Inno Setup 安装与配置
1. 下载与安装
- 官网地址:Inno Setup 下载页
- 版本选择:推荐下载 64 位 Installer(如
inno setup 6 Setup x64.exe
),兼容现代 Windows 系统。 - 安装步骤:
- 双击安装包,选择默认语言(中文或英文)。
- 一路点击 下一步,默认安装路径为
C:\Program Files (x86)\Inno Setup 6
。
2. 界面简介
安装完成后打开 Inno Setup Compiler
,主界面包含:
- 脚本编辑器:编写安装逻辑的代码区域。
- 编译按钮:生成安装包的核心功能按钮(绿色三角图标)。
- 常用工具栏:快速访问向导、调试、语言设置等功能。
三、使用向导快速创建安装包
1. 启动脚本向导
点击菜单栏 文件 > 新建,或直接点击工具栏的 向导 图标,进入安装包创建向导。
2. 配置应用程序信息
(1)基础信息页
- 应用程序名称:例如
My QT App
- 应用程序版本:
1.0.0
- 应用程序发布者:公司名或个人名称(如
TechCo Ltd
) - 应用程序网站:可选填官网地址(如
https://www.techco.com
)
(2)主执行文件页
- 点击添加:选择 QT 编译生成的
Release
版可执行文件(.exe
)。 - 自动添加依赖文件:若使用动态库模式,需手动添加
windeployqt
导出的所有 DLL 和资源文件(建议先将.exe
和依赖文件放在同一目录)。
(3)文件关联页(可选)
若程序需要关联特定文件类型(如 .qtx
文件),可在此处配置:
- 文件扩展名:输入
qtx
- 描述:
QT App File
- 图标:选择程序图标(
.ico
)
(4)开始菜单文件夹页
- 菜单文件夹名称:建议与应用程序名称一致(如
My QT App
) - 勾选创建桌面快捷方式:提升用户启动便利性。
(5)安装位置页
- 默认安装路径:建议使用
{programfiles}\My QT App
({programfiles}
为系统变量,自动适配 32/64 位系统)。 - 允许用户更改路径:保持勾选,符合用户习惯。
(6)语言选择页
- 勾选中文(简体) 和 English,支持多语言安装界面。
(7)完成配置
- 脚本文件名:输入脚本保存路径(如
C:\MyApp\installer.iss
)。 - 点击完成:向导自动生成初始安装脚本。
四、手动优化安装脚本(关键步骤)
向导生成的脚本可能需要进一步调整,以下是常见优化点:
1. 添加程序图标
在脚本开头添加:
; 定义程序图标路径(需替换为实际路径)
#define MyAppIcon "C:\\MyApp\\resources\\app.ico"[Icons]
Name: "{group}\My QT App"; Filename: "{app}\MyApp.exe"; IconFile: "{app}\{MyAppIcon}"
Name: "桌面快捷方式"; Filename: "{app}\MyApp.exe"; IconFile: "{app}\{MyAppIcon}"; WorkingDir: "{app}"
2. 处理 QT 动态库依赖
若使用动态库模式,需确保所有 DLL 被正确包含。在 [Files]
节中:
; 示例:添加 QT 核心动态库
Source: "C:\MyApp\release\Qt6Core.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\MyApp\release\Qt6Gui.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\MyApp\release\Qt6Widgets.dll"; DestDir: "{app}"; Flags: ignoreversion
注意:
Flags: ignoreversion
表示忽略版本检查,避免因版本不一致导致安装失败。- 若使用
windeployqt
导出依赖,可直接复制整个目录到[Files]
节,无需逐个添加文件。
3. 添加卸载功能
Inno Setup 自动生成卸载脚本,无需额外代码。安装完成后,会在开始菜单创建 卸载程序 快捷方式,用户可通过控制面板或快捷方式卸载程序。
4. 压缩文件以减小安装包体积
在 [Setup]
节中添加:
Compression=lzma2 ; 推荐压缩算法(体积最小,但压缩时间较长)
SolidCompression=yes ; 启用固态压缩,进一步减小体积
五、编译与测试安装包
1. 编译脚本
点击工具栏 编译 按钮(绿色三角),Inno Setup 会自动生成安装包(.exe
),路径显示在底部日志窗口中。
2. 测试安装流程
- 双击安装包:检查安装向导是否正常显示,路径选择、快捷方式创建是否正确。
- 运行程序:安装完成后,通过桌面图标或开始菜单启动程序,验证功能是否正常。
- 卸载程序:通过开始菜单卸载快捷方式或控制面板,检查是否残留文件。
六、高级技巧:静态库模式打包
若使用 静态库编译 QT 程序(可执行文件不依赖 DLL),打包步骤更简单:
- 直接将静态编译的
.exe
作为主文件添加到 Inno Setup。 - 无需包含任何 DLL 文件,安装包仅包含
.exe
和资源文件,体积可能较大但部署更便捷。
静态库编译命令参考(QT 源码编译):
configure -static -release -make libs -prefix "C:\Qt\static"
mingw32-make && mingw32-make install
七、常见问题与解决方案
1. 缺少 Qt6Core.dll 等依赖
- 原因:未正确使用
windeployqt
导出动态库。 - 解决:
- 在 QT 命令行中运行
windeployqt your_app.exe
重新导出依赖。 - 确保 Inno Setup 的
[Files]
节包含所有导出的 DLL。
- 在 QT 命令行中运行
2. 安装包体积过大
- 原因:包含冗余文件(如调试版 DLL、示例资源)。
- 解决:
- 使用
windeployqt --release
导出 Release 版 DLL。 - 启用 Inno Setup 的
lzma2
压缩(见上文优化步骤)。
- 使用
3. 图标显示异常
- 原因:图标路径错误或格式不支持。
- 解决:
- 使用
.ico
格式图标(推荐 256x256 像素)。 - 确保图标路径在脚本中正确引用(如使用绝对路径或
{app}
变量)。
- 使用
八、总结
通过 Inno Setup 打包 QT 项目,既能提升用户体验,又能简化部署流程。动态库模式适合追求可执行文件体积小的场景,静态库模式适合需要完全独立部署的场景。建议根据项目需求选择合适的打包方式,并通过多次测试确保安装包的稳定性。
附:Inno Setup 脚本模板
; 脚本模板(动态库模式)
[Setup]
AppName=My QT App
AppVersion=1.0.0
AppPublisher=TechCo Ltd
AppPublisherURL=https://www.techco.com
AppSupportURL=https://www.techco.com/support
AppUpdatesURL=https://www.techco.com/updates
DefaultDirName={programfiles}\My QT App
DefaultGroupName=My QT App
OutputDir=C:\MyApp\installer
OutputBaseFilename=MyAppInstaller
Compression=lzma2
SolidCompression=yes[Files]
Source: "C:\MyApp\release\*"; DestDir: "{app}"; Flags: recursesubdirs createallsubdirs[Icons]
Name: "{group}\My QT App"; Filename: "{app}\MyApp.exe"
Name: "桌面快捷方式"; Filename: "{app}\MyApp.exe"; WorkingDir: "{app}"[Run]
Filename: "{app}\MyApp.exe"; Description: "Launch My QT App"; Flags: nowait postinstall skipifsilent
通过以上步骤,即可轻松将 QT 项目打包为专业的安装程序,快去试试吧! 🚀
相关文章:
【QT 项目部署指南】使用 Inno Setup 打包 QT 程序为安装包(超详细图文教程)
一、为什么需要打包成安装包? 在完成 QT 项目开发后,直接发布可执行文件(.exe)和依赖的 DLL 文件虽然可行,但存在以下问题: 用户体验差:用户需手动管理文件路径,容易因文件缺失导致…...

电子电器架构 --- 整车造车阶段四个重要节点
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

黑马点评-用户登录
文章目录 用户登录发送短信验证码注册/登录校验登录 用户登录 发送短信验证码 public Result sendCode(String phone, HttpSession session) {// 1.校验手机号if (RegexUtils.isPhoneInvalid(phone)) {// 2.如果不符合,返回错误信息return Result.fail("手机…...
ecmascript 第6版特性 ECMA-262 ES6
https://blog.csdn.net/zlpzlpzyd/article/details/146125018 在之前写的文章基础上,ES6在export和import的基础外,还有如下特性 特性说明let/const块级作用域变量声明>箭头函数Promise异步编程...

十二、Hive 函数
作者:IvanCodes 日期:2025年5月1日 专栏:Hive教程 在数据处理的广阔天地中,我们常常需要对数据进行转换、计算、清洗或提取特定信息。Hive 提供了强大的内置运算符和丰富的内置函数库,它们就像魔法师手中的魔法棒&…...

No More Adam: 新型优化器SGD_SaI
一.核心思想和创新点 2024年12月提出的SGD-SaI算法(Stochastic Gradient Descent with Scaling at Initialization)本质上是一种在训练初始阶段对不同参数块(parameter block)基于**梯度信噪比(g-SNR, Gradient Signa…...
数据结构【AVL树】
AVL树 1.AVL树1.AVL的概念2.平衡因子 2.AVl树的实现2.1AVL树的结构2.2AVL树的插入2.3 旋转2.3.1 旋转的原则 1.AVL树 1.AVL的概念 AVL树可以是一个空树。 它的左右子树都是AVL树,且左右子树的高度差的绝对值不超过1。AVL树是一颗高度平衡搜索二叉树,通…...
C#将1GB大图裁剪为8张图片
C#处理超大图片(1GB)需要特别注意内存管理和性能优化。以下是几种高效裁剪方案: 方法1:使用System.Drawing分块处理(内存优化版) using System; using System.Drawing; using System.Drawing.Imaging; us…...
数据库——SQL约束窗口函数介绍
4.SQL约束介绍 (1)主键约束 A、基本内容 基本内容 p r i m a r y primary primary k e y key key约束唯一表示数据库中的每条记录主键必须包含唯一的值(UNIQUE)主键不能包含NULL值(NOT NULL)每个表都应…...
Linux系统启动相关:vmlinux、vmlinuz、zImage,和initrd 、 initramfs,以及SystemV 和 SystemD
目录 一、vmlinux、vmlinuz、zImage、bzImage、uImage 二、initrd 和 initramfs 1、initrd(Initial RAM Disk) 2、initramfs(Initial RAM Filesystem) 3、initrd vs. initramfs 对比 4. 如何查看和生成 initramfs 三、Syste…...

JSP链接MySQL8.0(Eclipse+Tomcat9.0+MySQL8.0)
所用环境 Eclipse Tomcat9.0 MySQL8.0.21(下载:MySQL Community Server 8.0.21 官方镜像源下载 | Renwole) mysql-connector-java-8.0.21(下载:MySQL :: Begin Your Download) .NET Framework 4.5.2(下…...
Python爬虫-爬取百度指数之人群兴趣分布数据,进行数据分析
前言 本文是该专栏的第56篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前的文章《Python爬虫-爬取百度指数之需求图谱近一年数据》中,笔者有详细介绍过爬取需求图谱的数据教程。 而本文,笔者将再以百度指数为例子,基于Python爬虫获取指定关键词的人群“兴…...

SEO长尾词与关键词优化实战
内容概要 在SEO优化体系中,长尾关键词与核心关键词的协同作用直接影响流量获取效率与用户转化路径。长尾词通常由3-5个词组构成,搜索量较低但意图明确,能精准触达细分需求用户;核心关键词则具备高搜索量与广泛覆盖能力࿰…...

机器学习-人与机器生数据的区分模型测试-数据处理1
附件为训练数据,总体的流程可以作为参考。 导入依赖 import pandas as pd import os import numpy as np from sklearn.model_selection import train_test_split,GridSearchCV from sklearn.ensemble import RandomForestClassifier,VotingClassifier from skle…...

HelloWorld
HelloWorld 新建一个java文件 文件后缀名为 .javahello.java【注意】系统可能没有显示文件后缀名,我们需要手动打开 编写代码 public class hello {public static void main(String[] args) {System.out.print(Hello,World)} }编译 javac java文件,会生…...
令牌桶和漏桶算法使用场景解析
文章目录 什么时候用令牌桶,什么时候用漏桶算法??先放结论 两个算法一眼看懂什么时候选令牌桶?什么时候选漏桶?组合用法(90% 的真实系统都会这么干)小结记忆 对令牌桶和漏桶组合用法再次详细叙述…...
轻量、优雅、高扩展的事件驱动框架——Hibiscus-Signal
在现代企业级应用中,事件驱动架构(EDA)已成为解耦系统、提升扩展性的利器。今天给大家推荐一个非常优秀的国产轻量级事件驱动框架 —— Hibiscus Signal,它不仅天然整合 Spring Boot,还提供完整的事件生命周期支持&…...

SEO 优化实战:ZKmall模板商城的 B2C商城的 URL 重构与结构化数据
在搜索引擎算法日益复杂的今天,B2C商城想要在海量信息中脱颖而出,仅靠优质商品和营销活动远远不够。ZKmall模板商城以实战为导向,通过URL 重构与结构化数据优化两大核心策略,帮助 B2C 商城实现从底层架构到搜索展示的全面升级&…...
2020CCPC河南省赛题解
A. 班委竞选 签到题,模拟。 #include <bits/stdc.h> #define x first #define y second #define int long long //#define double long doubleusing namespace std; typedef unsigned long long ULL ; typedef pair<int,int> PII ; typedef pair<d…...

数字万用表与指针万用表使用方法及注意事项
在电子测量领域,万用表是极为常用的工具,数字万用表和指针万用表各具特点。熟练掌握它们的使用方法与注意事项,能确保测量的准确性与安全性。下面为您详细介绍: 一 、数字万用表按钮功能 > 进入及退出手动量程模式 每 按 […...
虚拟主播肖像权保护,数字时代的法律博弈
首席数据官高鹏律师团队 在虚拟主播行业蓬勃发展的表象之下,潜藏着一场关乎法律边界的隐形战争。当一位虚拟偶像的3D模型被非法拆解、面部数据被批量复制,运营方惊讶地发现——传统的肖像权保护体系,竟难以完全覆盖这具由代码与数据构成的“…...

【读代码】端到端多模态语言模型Ultravox深度解析
一、项目基本介绍 Ultravox是由Fixie AI团队开发的开源多模态大语言模型,专注于实现音频-文本的端到端实时交互。项目基于Llama 3、Mistral等开源模型,通过创新的跨模态投影架构,绕过了传统语音识别(ASR)的中间步骤,可直接将音频特征映射到语言模型的高维空间。 核心优…...

RabbitMQ工作流程及使用方法
一、什么是RabbitMQ RabbitMQ 是一款基于 AMQP(高级,消息队列协议) 的开源消息中间件,专为分布式系统设计,用于实现应用程序间的异步通信,其核心功能是通过 消息代理(Message Broker&…...
Java 面向对象进阶:解锁多态、内部类与包管理
Java 面向对象进阶:解锁多态、内部类与包管理 🔑 在 Java 的面向对象编程中,多态赋予了对象“多种形态”的能力,内部类提供了更精细的代码组织方式,而包则帮助我们管理和组织大量的类。今天,我们将深入探讨…...

算法:分治法
实验内容 在一个2kⅹ2k个方格组成的棋盘中,若恰有一个方格与其他方格不同,则称该方格为特殊方格,且称该棋盘为一特殊棋盘。 显然,特殊方格出现的位置有4k 种情况,即k>0,有4k 种不同的特殊棋盘 棋盘覆盖:…...

MySQL初阶:sql事务和索引
索引(index) 可以类似理解为一本书的目录,一个表可以有多个索引。 索引的意义和代价 在MySQL中使用select进行查询时会经过: 1.先遍历表 2.将条件带入每行记录中进行判断,看是否符合 3.不符合就跳过 但当表中的…...

docker部署第一个Go项目
1.前期准备 目录结构 main.go package mainimport ("fmt""github.com/gin-gonic/gin""net/http" )func main() {fmt.Println("\n .::::.\n .::::::::.\n :::::::::::\n …...
day27 python 装饰器
目录 一、装饰器的基本概念 示例:用装饰器优化质数查找函数 二、装饰器的高级用法 1. 支持任意参数的装饰器 2. 装饰器的返回值处理 在 Python 编程中,装饰器是一个非常强大的功能,它可以让其他函数或方法在不需要做任何代码修改的前提下…...

Visual Studio2022跨平台Avalonia开发搭建
由于我已经下载并安装了 VS2022版本,这里就跳过不做阐述。 1.安装 Visual Studio 2022 安装时工作负荷Tab页勾选 “.NET 桌面开发” 和“Visual Studio扩展开发” ,这里由于不是用的微软的MAUI,所以不用选择其他的来支持跨平台开发&a…...

css iconfont图标样式修改,js 点击后更改样式
背景: 在vue项目中,通过点击/鼠标覆盖,更改选中元素的样式,可以通过js逻辑,也可以根据css样式修改。包括以下内容:iconfont图标的引入以及使用,iconfont图标样式修改【导入文件是纯白࿰…...