【QT】项目打包与发布安装

文章目录

    • 一、引言
    • 二、前期准备
    • 三、打包QT项目
      • 3.1 编译release版
      • 3.2 相关依赖打包
      • 3.3 打包发布
      • 3.4 安装
    • 四、打包普通项目
    • 五、结束语

一、引言

当Qt程序编写完成通过IDE编译就可以得到对应的可执行程序,这个可执行程序在本地运行是完全没有问题的。因为在本地有Qt环境,程序运行过程中可以加载到相关的动态库。但是如果我们想把这个Qt程序给到其他人使用可能就会出问题了,原因如下:

  • 对方本地根本没有Qt开发环境
  • 对方本地有Qt开发环境,但是和我们使用的版本不一致
  • 对方本地有Qt开发环境并且使用的版本与我们一致,但是没有配置环境变量

诸如此类的情况都会导致我们的程序如果直接发送给对方,对方拿到可执行程序之后无法运行。下面来给大家讲一下解决方案。

本文讨论了Windows下QT项目如何打包成单体式exe程序,并支持一键安装与部署。

二、前期准备

  • 操作系统:win10
  • 本地已安装QT以及相关开发环境
  • 已开发好的QT项目且本地运行无异常
  • 安装打包软件:innosetup(一路next即可)。

三、打包QT项目

3.1 编译release版

如果要发布程序,需要切换为Release版本(Debug为调试版本),编译器会对生成的Release版可执行程序会进行优化,生成的可执行程序会更小。
这里以QtCreator为例,截图如下:
在这里插入图片描述
编译好之后,去相关的文件夹,把生成的exe程序复制到一个新的空文件夹下:
在这里插入图片描述
比如我把它复制到了test目录下。

3.2 相关依赖打包

先找到你的QT环境下的bin目录,一般情况下这个目录会被设置进环境变量中,也就是你编译套件所在的目录。
找不到的看下图:
在这里插入图片描述
在这里插入图片描述
进入这个bin目录,可以将这个路径设置进环境变量。

关于环境变量,说白了,它就是一些优先级比较高的路径。操作系统运行程序时会先从这些路径中找,如果没有再从其他地方找,找不到就报错。
比如你有个程序叫a.exe,它在C:\ffmpeg-7.1.1-essentials_build\路径下。如果你想在任何地方打开cmd运行这个程序,你就必须要写全路径:C:\ffmpeg-7.1.1-essentials_build\a.exe才能运行,否则跑不起来,但是如果你将他的路径C:\ffmpeg-7.1.1-essentials_build\写进环境变量里,那么你就可以直接打开cmd输入a.exe运行,而不必去写路径。

这个目录下有个qt自带的程序叫 windeployqt.exe ,功能是收集程序的相关依赖。找到它,记住它的路径。

回到之前你放exe程序的那个目录,我上面放的是test目录,按住shift并右键打开powershell终端或者cmd,运行windeployqt.exe程序,后跟你的exe程序:

windeployqt.exe yours.exe

以我举例:

D:\Qt\6.9.0\mingw_64\bin\windeployqt.exe .\spark_player.exe

这样windeployqt.exe会收集你的exe程序的相关依赖并复制到这个文件夹下,运行完之后你就会发现这个目录下多了很多文件。此时,点击打开你的exe程序开能不能运行,能运行就行。不能运行的话会提示你缺的文件,找到这些文件,复制进这个exe程序的目录。(everything全局搜)

最终目标是:你在这个阶段要保证单击你的exe程序他能正常运行。

3.3 打包发布

打开innosetup。
创建项目
在这里插入图片描述

在这里插入图片描述
填写信息
在这里插入图片描述
跟你平时安装的程序一样
在这里插入图片描述

在这里插入图片描述

由于可执行程序关系的动态库有很多,所以可以直接添加动态库的目录,选中对应的目录之后,如果里边还有子目录会弹出如下对话框,选择是即可,需要包含这些子目录。
在这里插入图片描述
给可执行程序关联本地的某种格式的磁盘文件(比如记事本程序会自动关联本地的 .txt 文件),对于我的可执行程序来说无需关联,因此没有做任何设置,直接下一步
在这里插入图片描述
在这里插入图片描述
安装模式:
在这里插入图片描述
英文:
在这里插入图片描述
留意一下这里的路径,等会需要去这个目录找生成的单体exe:
在这里插入图片描述
在这里插入图片描述
这之后会提示你创建一个脚本,下回打包你就可以选中执行脚本重复以上步骤,而不需要这样一步一步点击安装了。
在这里插入图片描述
在这里插入图片描述

3.4 安装

找到你生成的exe文件,双击安装即可。

第二次你就可以使用最后生成的脚本进行打包了,前几次可能不熟,多来几次就玩透了。

四、打包普通项目

仔细回顾一下上述过程,其实所谓的打包就是先保证这个程序在你本地可用,然后借助第三方软件打包成一个单体式应用程序。同理,打包C++写的普通项目也是一样的流程,这里不再赘述。

这里引申出一个问题:普通项目没有图标有点难看?
这个问题qt里你可以借助于pro文件帮你生成带图标的程序,同理借助于cmake也可以。
具体做法就是写一个.rc文件,文件里指定相应的图标文件路径
例如:app.rc里写上这一句:
IDI_ICON1 ICON "train.ico"
然后cmake编译的时候编译它:
add_executable(${PROJECT_NAME} ${SRC_LIST} app.rc)
之后编译生成的文件就有图标了

五、结束语

enjoy it !
好用的话别忘三连打卡~

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

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

相关文章

提示词工程:通向AGI时代的人机交互艺术

‌引言:从基础到精通的提示词学习之旅‌ 欢迎来到 ‌"AGI时代核心技能"‌ 系列课程的第二模块——‌提示词工程‌。在这个模块中,我们将系统性地探索如何通过精心设计的提示词,释放大型语言模型的全部潜力,实现高效、精…

三款实用电脑工具

今天为大家精心推荐三款实用软件,分别是人声伴奏分离软件、文件夹迁移软件和文字转拼音软件。 第一款:NovaMSS NovaMSS是一款功能强大的人声伴奏分离软件,它提供社区版和专业版,社区版永久免费。 该软件能够一键提取人声、伴奏、…

CentOS 7 安装指定版本 Docker 及镜像加速/配置优化攻略

摘要 本文详述 CentOS 7 系统下安装指定版本 Docker ,涵盖镜像加速配置(实测最快)、存储位置优化、日志轮转等核心配置。 文章目录 一、安装指定版本Docker1.1 卸载旧版本(如有)1.2 安装依赖包1.3 添加Docker仓库&…

达梦、PostgreSQL数据库讲json解析成临时表(json_table函数的使用)

官网json_table文档路由 路径表达式文档路由 背景:有一些动态表格,需要新建一张中间表,里边就两三个字段比如主表id,某某类型id,某某类型是否选中。对于这种表新建个表还得加各种创建人修改人版本号是否逻辑删除啥的字段太过麻烦。于是可以直…

【软件测试】测试用例的设计方法

目录 一、基于需求进行测试用例的设计 1.1 功能需求测试分析 二、黑盒测试用例设计方法 2.1 等价类划分法(解决穷举) 2.1.1 等价类设计步骤 2.1.2 等价类划分法案例 2.1.2.1 验证 QQ 账号的合法性 2.1.2.2 验证某城市电话号码的正确性 2.1.3 适用场景 2.2 边界值分析…

微服务系统设计

在设计微服务系统时,需要综合考虑架构、业务划分、通信方式、数据管理、安全性、运维等多个方面的问题。 一、微服务系统设计需考虑的问题 1. 服务划分 如何合理拆分服务,避免“微服务地狱”。拆分粒度不宜过小:太多服务增加管理和通信成本…

Django ORM: values() 和 annotate() 方法详解

1. values()方法 1.1 基本概念 values()方法用于返回一个包含字典的QuerySet,而不是模型实例。每个字典表示一个对象,键对应于模型字段名称。 1.2 基本用法 # 获取所有书籍的标题和出版日期 from myapp.models import Bookbooks Book.objects.value…

43.防雷击浪涌设计

防雷击浪涌设计 1. 雷击浪涌形成的机理2. 雷击浪涌的防护 1. 雷击浪涌形成的机理 雷击浪涌分为直击雷和感应雷: 直击雷——带电荷的云对建筑物、避雷针等放电,或者带异种电荷的雷云撞击放电,其能量超级大; 感应雷——雷云在高压…

双端口ram与真双端口ram的区别

端口独立性 真双端口RAM:拥有两个完全独立的读写端口(Port A和Port B),每个端口都有自己的地址总线、数据总线、时钟、使能信号和写使能信号。这意味着两个端口可以同时进行读写操作,且互不干扰。 伪双端口RAM&…

Python毕业设计219—基于python+Django+vue的房屋租赁系统(源代码+数据库+万字论文)

毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于pythonDjangovue的房屋租赁系统(源代码数据库万字论文)219 一、系统介绍 本项目前后端分离,分为租客、房东、管理员三种角色 1、租客: 注册、登录、公…

Webpack基本用法学习总结

Webpack 基本使用核心概念处理样式资源步骤: 处理图片资源修改图片输出文件目录 自动清空上次打包的内容EslintBabel处理HTML资源搭建开发服务器生产模式提取css文件为单独文件问题: Css压缩HTML压缩 小结1高级SourceMap开发模式生产模式 HMROneOfInclud…

数字IC前端学习笔记:锁存器的综合

相关阅读 数字IC前端专栏https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 锁存器是一种时序逻辑,与寄存器相比面积更小,但它的存在会使静态时序分析(STA)变得更加复杂,因此懂得什么样的设计会综合出…

LVGL源码学习之渲染、更新过程(2)---无效区域的处理

LVGL版本:8.1 往期回顾: LVGL源码学习之渲染、更新过程(1)---标记和激活 区域合并 在前面的代码分析中,发现标记无效区域的工作其实很繁琐,虽然大部分区域因为包含关系被剔除,但仍可能存在相互交叉的区域&#xff0c…

01 dnsmasq 中 dns服务

前言 这里我们主要是 来看一下 dns 服务器这边的相关业务处理 通常来说 在我们日常生活中 还是经常会需要使用 dns 的情况, 主要是更加友好的去给一个主机命名一个别名 比如 现在我的应用在服务器 192.168.220.133 但是我不想记这个生硬的 ip, 我可能更期望记录一个域名, …

最优化方法Python计算:有约束优化应用——线性Lasso回归分类器

利用线性Lasso模型类LineLassoModel类(见博文《最优化方法Python计算:有约束优化应用——线性Lasso回归预测器》)及分类器类Classification(见博文《最优化方法Python计算:无约束优化应用——线性回归分类器》&#xf…

Python基础学习-Day20

目录 奇异值分解(SVD)的输入和输出奇异值的应用实际案例1. 问题分析2. 解决方案:对测试集应用相同的变换3. 为什么不能对测试集单独做 SVD?4. 代码示例:训练集和测试集的 SVD 降维6. 实际操作中的注意事项 奇异值分解&…

2025年 全新 AI 编程工具 Cursor 安装使用教程

一、Cursor 软件下载 首选,登录Cursor官网,进行软件下载,官网下载地址如下: Cursor AI IDE 下载 二、Cursor软件安装配置 此处以Windows10系统安装为例,下载完成之后,右键安装包,以管理员身份…

[vue]error:0308010C:digital envelope routines::unsupported

npm run dev 报错: \node_modules\webpack\hot\dev-server.jsnode:internal/crypto/hash:71 this[kHandle] new _Hash(algorithm, xofLen); Error: error:0308010C:digital envelope routines::unsupported opensslErrorStack: [ error:03000086:digital env…

开放的力量:新零售生态的共赢密码

当某头部生鲜平台向供应商开放销售预测系统后,合作伙伴的库存周转率竟提升12%——这个反常识的案例,正在重塑商业竞争的底层逻辑。 生态共建三板斧 ▌模块化设计:像搭积木一样开放 • 乐高式API架构:30%接口支持自由组合&#xff…

深入理解Spring缓存注解:@Cacheable与@CacheEvict

在现代应用程序开发中,缓存是提升系统性能的重要手段。Spring框架提供了一套简洁而强大的缓存抽象,其中Cacheable和CacheEvict是两个最常用的注解。本文将深入探讨这两个注解的工作原理、使用场景以及最佳实践。 1. Cacheable注解 基本概念 Cacheable…