当前位置: 首页 > news >正文

在Qt编写的exe或者dll中设置版本号

1.背景

在别人编写的exe或者动态库中,通过右键–》属性–》详细信息中,通常都有版本信息:
在这里插入图片描述

那我们自己编译出来的Qt程序,如何设置这些版本号呢?

2.解决方案

参考【.pro文件中设置版本等信息】,只要在工程的.pro文件中添加以下信息就可以了:

QMAKE_LFLAGS += -Wl,--kill-at  #  避免有些平台如VB调用库出问题
CONFIG += skip_target_version_ext # 避免在dll文件的名字里面自动加数字VERSION = 1.2.3QMAKE_TARGET_PRODUCT = 产品名称
QMAKE_TARGET_COMPANY = 公司
QMAKE_TARGET_DESCRIPTION = 文件描述
QMAKE_TARGET_COPYRIGHT = 版权

比如说我的工程设置之后,效果是这样的:
在这里插入图片描述

3.在h或者cpp文件中使用该VERSION变量

在.pro文件中设置了版本后,我们可能需要在cpp文件中取得这个版本号。比如说我们在编译一个函数库给别人使用,那么一般都会提供一个函数类似QString version()返回当前库的版本,用来做版本确认。
有没有什么办法,可以从cpp文件中读取到.pro文件中定义的这个VERSION变量?
其实是有的,参考这里:【如何将Qt .Pro文件中的自定义变量内容 或 内置变量的内容 获取 到Qt的.cpp或.h中使用…】,我们可以这样操作:

在.pro文件中追加一个宏定义SDK_VERSION,其值等于VERSION

DEFINES += SDK_VERSION=$$VERSION

然后在cpp中就可以这样读取到了:

---#define SSS(R) #R
#define TTT(R) SSS(R)int main(int argc, char *argv[])
{
---qDebug() << "version:" << TTT(SDK_VERSION);
---
}

为什么这样就可以读取到呢?
仔细观察,假如我们直接用#SDK_VERSION的话,会直接得到字符串"SDK_VERSION"。因此,要等SDK_VERSION先展开之后,再将其转成字符串。也就是要二次展开,所以,就设计了TTT这宏定义。我们来看看展开过程:
源码–》TTT(SDK_VERSION)
第一次展开–》SSS(0.16.73.13)
第二次展开–》#0.16.73.13
这样子就得到字符串了。

4.注意

但是这样操作后,假如你更新.pro中的VERSION值后,编译,一般会发现程序这边得到的TTT(SDK_VERSION)是旧的。这时候最好是先执行clean再编译。感觉这个是QtCreator的bug。
在这里插入图片描述
有时候QtCreator的行为怪怪的,各种出bug,有时候是程序不可以运行、有时候是无法调试、有时候是代码修改了但是没生效、、、。总之遇到这些奇奇怪怪的情况时,都可以试一下这个Clean命令,让其重新编译一次。还不行的话,重启电脑试试(真的,我就是这样做了就好了);


参考:
【.pro文件中设置版本等信息】
【如何将Qt .Pro文件中的自定义变量内容 或 内置变量的内容 获取 到Qt的.cpp或.h中使用…】

相关文章:

  • 人工智能历史与现状
  • 自旋锁(spin lock)
  • RabbitMQ消息的可靠传输和防止消息丢失
  • vscode 调试
  • Redis之线程IO模型
  • Redisson实现分布式锁
  • C语言 -- 宏的变长参数定义
  • kotlin lambda 表达式的原理、语法和详细用法
  • 专业纸箱厂:品质之选
  • JS 实现Date日期格式的本地化
  • Halcon 多相机统一坐标系
  • 2024年6月四六级考试复盘
  • 【Python】PySide6使用入门和注意事项
  • springboot整合sentinel接口熔断
  • 在线兴趣教学类线上学习APP应用开发部署程序组建研发团队需要准备什么?
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • nodejs实现webservice问题总结
  • React组件设计模式(一)
  • 机器学习 vs. 深度学习
  • 利用DataURL技术在网页上显示图片
  • 如何学习JavaEE,项目又该如何做?
  • 试着探索高并发下的系统架构面貌
  • 与 ConTeXt MkIV 官方文档的接驳
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​520就是要宠粉,你的心头书我买单
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • #android不同版本废弃api,新api。
  • $(function(){})与(function($){....})(jQuery)的区别
  • $jQuery 重写Alert样式方法
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (二)pulsar安装在独立的docker中,python测试
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (学习日记)2024.01.19
  • (一)基于IDEA的JAVA基础12
  • *Django中的Ajax 纯js的书写样式1
  • .NET BackgroundWorker
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET 反射的使用
  • .Net 垃圾回收机制原理(二)
  • .NET程序员迈向卓越的必由之路
  • .sdf和.msp文件读取
  • @JsonSerialize注解的使用
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • [AIGC] SQL中的数据添加和操作:数据类型介绍
  • [ChromeApp]指南!让你的谷歌浏览器好用十倍!
  • [hdu 3746] Cyclic Nacklace [kmp]
  • [HNOI2008]玩具装箱toy
  • [JavaScript]_[初级]_[关于forin或for...in循环语句的用法]
  • [JavaWeb]——获取请求参数的方式(全面!!!)
  • [JavaWeb学习] Spring Ioc和DI概念思想
  • [LeetCode] Verify Preorder Sequence in Binary Search Tree 验证二叉搜索树的先序序列
  • [nextjs]推荐几个很好看的模板网站
  • [NOIP2003 普及组] 乒乓球(模拟)