Qt 程序发布以及打包成exe安装包
一、简述
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,点击 【file】→【new】,新建一个脚本向导程序,然后点击【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 可执行文件替换掉,再打开原先生成的脚本文件运行,即可生成新版本的 exe 安装包文件。
最后就生成了 exe 安装包文件,点击打开exe文件即可进行安装。
Qt 程序发布以及打包成exe安装包的更多相关文章
- Qt之程序发布以及打包成exe安装包
一.简述 Qt项目开发完成之后,需要打包发布程序,而因为用户电脑上没有Qt配置环境,所以需要将release生成的exe文件和所依赖的dll文件复制到一个文件夹中,然后再用 Inno Setup打包工 ...
- 利用Advanced Installer将asp.netMVC连同IIS服务和mysql数据库一块打包成exe安装包
因为业务需要,项目中需要把asp.netmvc项目打包成exe安装程序给客户,让客户直接可以点下一步下一步安装部署web程序,并且同时要将IIS服务和mysql一同安装到服务器上,因为客户的电脑可能是 ...
- 【打包成exe安装包文件发布你的程序】使用QT联系人管理系统的例子
[前言]在 QT数据库使用案列[联系人]-- 使用sqlite和QStringListModel 中,我们写了这个程序,如何将它打包成安装文件发给其他小伙伴呢? 我们使用 nsis-2.46-setu ...
- Java 打包成exe安装包
1.在eclipse中导出Runnable JAR file 2.选择主函数所在的类和输出位置后finish: 3.这里选择的打包工具是exe4j,在网上找序列号注册一下,否则在打完后在exe运行时, ...
- python程序开子进程打包成exe文件运行炸内存原因剖析
首先给出伪代码 from multiprocessing import Process def task(): print("hahaha") pass if __name__ = ...
- 反编译pyinstaller打包的exe安装包
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译 在这里分享一些技巧和经验给大家.辛苦撰文分享,转载或引用请保留本文作者信息及文章链接. 作者的环境: win ...
- Qt程序打包成exe可执行文件图文教程(图文并茂,且用到了filepack)
很多Qt爱好者想发布自己的Qt软件,但却发现在其他没有安装Qt SDK的机器上无法运行,这就是本文想要说明的问题.现在网上大部分软件都要发布自己开发的应用程序,都会打包到exe文件中,待安装完exe文 ...
- Qt程序打包成exe可执行文件
很多Qt爱好者想发布自己的Qt软件,但却发现在其他没有安装Qt SDK的机器上无法运行,这就是本文想要说明的问题.现在网上大部分软件都要发布自己开发的应用程序,都会打包到exe文件中,待安装完exe文 ...
- Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer 关于Newtonsoft.Json,LINQ to JSON的一个小demo mysql循环插入数据、生成随机数及CONCAT函数 .NET记录-获取外网IP以及判断该IP是属于网通还是电信 Guid的生成和数据修整(去除空格和小写字符)
Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer Advanced Installer :Free for 30 da ...
随机推荐
- 【python与机器学习实战】感知机和支持向量机学习笔记(一)
对<Python与机器学习实战>一书阅读的记录,对于一些难以理解的地方查阅了资料辅以理解并补充和记录,重新梳理一下感知机和SVM的算法原理,加深记忆. 1.感知机 感知机的基本概念 感知机 ...
- VGG Net 论文细读
论文地址:<Very Deep Convolutional Networks for Large-Scale Image Recognition> 一.背景 LSVRC:大规模图像识别挑战 ...
- 10 个超棒的 JavaScript 简写技巧
今天我要分享的是10个超棒的JavaScript简写方法,可以加快开发速度,让你的开发工作事半功倍哦. 开始吧! 1. 合并数组 普通写法: 我们通常使用Array中的concat()方法合并两个数组 ...
- ES6继承和ES5继承是完全一样的么?
继承方式 ES5 prototype 继承 通过原型链(构造函数 + [[prototype]])指向实现继承. (备注:后续__proto__我都会写成[[prototype]]这种形式) 子类的 ...
- chromium调试技巧
调试技巧: 1.多进程不方便跟踪渲染进程,单渲染进程的设置方法 command_line->AppendSwitchWithValue("--renderer-process- ...
- JavaWeb——CSS总结
CSS 记得大一下学期那会参加基地后就开始跟师兄师姐接触前端了,利用业余时间在站看各种视频.由于初次认知并且时间也能不固定集中,也存在跳跃式学习等等原因,这就导致了好多知识点要么漏掉要么没记全,只能懂 ...
- Python - typing 模块 —— 常用类型提示
前言 typing 是在 python 3.5 才有的模块 前置学习 Python 类型提示:https://www.cnblogs.com/poloyy/p/15145380.html 常用类型提示 ...
- SpringBoot枚举传参
创建一个接口所有枚举继承 package com.gecko.charging.common; public interface BaseEnum { Integer getCode(); } 具体的 ...
- 5、二进制安装K8s 之 部署kube-scheduler
二进制安装K8s之部署kube-scheduler 1.创建配置文件 cat > /data/k8s/config/kube-scheduler.conf << EOF KUBE_S ...
- WPF---数据绑定之Xml数据源(四)
一.场景 现在外部有一xml文件,我们想将该xml文件中的内容绑定到ListView中,该如何实现? 二.实现 xml文件的内容如下: <?xml version="1.0" ...