【C++】关于代码编译自动更新版本的问题

在写代码的时候,总是需要添加一个版本号,用于后续的版本管理

我常遇到的一个问题是,开发过程中,不一定会记得这件事情,导致有时候会出现同样的版本

于是希望有一个方式,能在编译代码的时候自动生成一个版本号

1.创建update_version.cmake文件

# 设置项目版本号
set(PROJECT_VERSION_MAJOR 1)
set(PROJECT_VERSION_MINOR 0)# 读取 version.h 文件
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/version.h")# 读取 PROJECT_VERSION_PATCH 的值file(READ "version.h" VERSION_H_CONTENTS)string(REGEX MATCH "PROJECT_VERSION_PATCH \"([0-999]+)\"" _match ${VERSION_H_CONTENTS})set(PROJECT_VERSION_PATCH ${CMAKE_MATCH_1})message(STATUS "Read patch: ${PROJECT_VERSION_PATCH}")# 将 PROJECT_VERSION_PATCH 值加 1math(EXPR PROJECT_VERSION_PATCH "${PROJECT_VERSION_PATCH} + 1")set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")message(STATUS "更新版本号: ${PROJECT_VERSION}")
else()set(PROJECT_VERSION_PATCH 1)
endif()# 获取编译日期
string(TIMESTAMP PROJECT_COMPILE_YEAR "%Y" UTC)
string(TIMESTAMP PROJECT_COMPILE_MONTH "%m" UTC)
string(TIMESTAMP PROJECT_COMPILE_DAY "%d" UTC)
string(TIMESTAMP PROJECT_COMPILE_TIME "%Y-%m-%d %H:%M:%S" UTC)# 生成版本文件
configure_file(version.h.in ${CMAKE_CURRENT_SOURCE_DIR}/version.h @ONLY)

2.创建version.h.in文件

#ifndef VERSION_H
#define VERSION_H#define PROJECT_VERSION_MAJOR "@PROJECT_VERSION_MAJOR@"
#define PROJECT_VERSION_MINOR "@PROJECT_VERSION_MINOR@"
#define PROJECT_VERSION_PATCH "@PROJECT_VERSION_PATCH@"
#define PROJECT_VERSION "@PROJECT_VERSION@"#define PROJECT_COMPILE_YEAR "@PROJECT_COMPILE_YEAR@"
#define PROJECT_COMPILE_MONTH "@PROJECT_COMPILE_MONTH@"
#define PROJECT_COMPILE_DAY "@PROJECT_COMPILE_DAY@"
#define PROJECT_COMPILE_TIME "@PROJECT_COMPILE_TIME@"#endif

3.创建version.h文件

无内容

4.修改cmakelist.txt文件

# 创建自定义目标, 执行 update_version.cmake 脚本
add_custom_target(update_versionCOMMAND ${CMAKE_COMMAND} -D GIT_VERSION=${GIT_VERSION} -P ${CMAKE_CURRENT_SOURCE_DIR}/update_version.cmakeWORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)add_dependencies(${PROJECT_NAME} update_version)

5.使用效果

会在目录下自动生成一个版本头文件

重新编译一下

版本文件会自动更新

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

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

相关文章

【Proteus仿真】【Arduino单片机】汽车倒车报警系统设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduinno单片机控制器,使用LCD1602液晶、按键、继电器电机模块、DS18B20温度传感器、蜂鸣器LED、HCSR04超声波等。 主要功能: 系统运行后,LCD16…

【网络安全学习】漏洞扫描:-04- ZAP漏洞扫描工具

**ZAP(Zed Attack Proxy)**是一款由OWASP组织开发的免费且开源的安全测试工具。 ZAP支持认证、AJAX爬取、自动化扫描、强制浏览和动态SSL证书等功能。 1️⃣ 安装zap工具 现在的kali版本不一定会预装zap,我们可以自行安装,安装也十分简单。 apt-get …

mybatis查询PostgreSQL报错:无法确定参数 $1 的数据类型

错误信息 ### Cause: org.postgresql.util.PSQLException: 错误: 无法确定参数 $1 的数据类型 ; bad SQL grammar []; nested exception is org.postgresql.util.PSQLException: 错误: 无法确定参数 $1 的数据类型] with root cause org.postgresql.util.PSQLException: 错误: …

转让中字头无区域农业公司变更快包迁全国

国家局名称的公司不仅可以提升企业形象,还能展现公司的实力。由于国家总局核名的审核标准相对严格,能够通过核名的企业一般都具备一定的实力和资质。因此,选择国家局核名的企业往往能够在市场中获得更多信任和认可。详情致电咨询我或者来公司…

C# 实现draw一个简单的温度计

运行结果 概述: 代码分析 该控件主要包含以下几个部分: 属性定义: MinValue:最低温度值。 MaxValue:最高温度值。 CurrentValue:当前温度值。 构造函数: 设置了一些控件样式来提升绘制效果…

【计算机网络体系结构】计算机网络体系结构实验-DHCP实验

服务器ip地址 2. 服务器地址池 3. 客户端ip 4. ping Ipconfig

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验7 虚拟局域网VLAN

一、实验目的 1.学习如何划分VLAN; 2.验证划分VLAN的作用; 3.学习如何用命令行创建VLAN,将端口划分到VLAN,设置端口类型。 二、实验要求 1.使用Cisco Packet Tracer仿真平台; 2.观看B站湖科大教书匠仿真实验视频&am…

3d中模型显示黑色给不了材质---模大狮模型网

如果3D模型显示黑色,而且无法给它添加材质,可能有以下几种原因: 一:模型没有UV贴图 UV贴图是3D模型表面纹理的一种方式,如果模型没有正确的UV贴图,渲染时可能会显示黑色。在大多数3D建模软件中&#xff0c…

qml:一个基础的界面设计

文章目录 1、文章说明2、效果图3、重要代码说明3.1 组件切换开关下拉框矩形卡片 3.2 窗口最大化后组件全部居中3.3 菜单栏3.4 Repeater实现重复8行3.5 图片加载直接加载图片文本转图片FluentUI中可供选择的图标 1、文章说明 qt6.5.3 qml写的一个界面配置设计软件,目…

算法设计与分析:动态规划法求扔鸡蛋问题 C++

目录 一、实验目的 二、问题描述 三、实验要求 四、算法思想和实验结果 1、动态规划法原理: 2、解决方法: 2.1 方法一:常规动态规划 2.1.1 算法思想: 2.1.2 时间复杂度分析 2.1.3 时间效率分析 2.2 方法二:动态规划加…

python数据分析-糖尿病数据集数据分析预测

一、研究背景和意义 糖尿病是美国最普遍的慢性病之一,每年影响数百万美国人,并对经济造成重大的经济负担。糖尿病是一种严重的慢性疾病,其中个体失去有效调节血液中葡萄糖水平的能力,并可能导致生活质量和预期寿命下降。。。。 …

若依框架集成微信支付

1. 添加微信支付相关依赖 <!-- 微信支付 --> <dependency><groupId>com.github.wxpay</groupId><artifactId>wxpay-sdk</artifactId><version>0.0.3</version> </dependency> <dependency><groupId>com.gi…

微信小程序开发---自定义底部tabBar

自定义tabBar注意事项&#xff1a; 在自定义 tabBar 模式下 &#xff0c;为了保证低版本兼容以及区分哪些页面是 tab 页&#xff0c;app.json文件中 tabBar 的相关配置项需完整声明&#xff0c;但这些字段不会作用于自定义 tabBar 的渲染。所有 tabBar 的样式都由该自定义组件…

Linux学习笔记:前言与操作系统的初识【1】

前言 为什么学习Linux 作为当下最流行的操作系统之一&#xff0c;学会如何使用和操作Linux操作系统也就是每位计算机学者的看家必备技能了。其次呢&#xff0c;本人受Linux的创始人林纳斯的影响太深了&#xff0c;觉得这个人太了不起了&#xff0c;而且人家大学里就自研开发出…

【Gradio】构建自定义多模态聊天机器人

这是我们构建自定义多模态聊天机器人组件两部分系列的第一部分。在第一部分中&#xff0c;我们将修改 Gradio 聊天机器人组件&#xff0c;使其能够在同一消息中显示文本和媒体文件&#xff08;视频、音频、图片&#xff09;。在第二部分中&#xff0c;我们将构建一个自定义的文…

深度解析RocketMq源码-持久化组件(一) MappedFile

1. 绪论 rocketmq之所以能够有如此大的吞吐量&#xff0c;离不开两个组件&#xff0c;一个是利用netty实现的高性能网络通信组件&#xff1b;另一个就是利用mmap技术实现的存储组件。而在rocketmq的存储组件中主要有三个组件&#xff0c;分别是持久化文件commitLog&#xff0c…

多模态MLLM都是怎么实现的(10)-Chameleon和Florence-2如果你想玩多模态就不能不了解

这个也是一个补充文&#xff0c;前9章基本把该讲的讲了&#xff0c;今天这个内容主要是因为Meta出了一个Chameleon&#xff0c;这个以后可能会成为LLaMA的一个很好的补充&#xff0c;或者说都有可能统一起来&#xff0c;叫LLaMA或者Chamleon或者什么别的&#xff0c;另外我司把…

【图解IO与Netty系列】Netty源码解析——事件循环

Netty源码解析——事件循环 Netty事件循环源码解析select()processSelectedKeys()NioMessageUnsafe#read()NioByteUnsafe#read() runAllTasks() Netty事件循环 当Netty服务端启动起来以后&#xff0c;就可以接受客户端发送的请求&#xff0c;接收到客户端发来的请求后就会有事…

计算机网络 交换机的VLAN配置

一、理论知识 1.VLAN的定义 ①VLAN虚拟局域网&#xff0c;是一种通过将局域网内的设备逻辑地而不是物理地划分成一个个网段从而实现虚拟工作组的技术。 ②IEEE于1999年颁布了用以标准化VLAN实现方案的802.1Q协议标准草案。 ③VLAN技术允许网络管理者将一个物理的LAN逻辑地划…

MySQL存储管理(一):删数据

从表中删除数据 从表中删除数据&#xff0c;也即是delete过程。 什么是表空间 表空间可以看做是InnoDB存储引擎逻辑结构的最高层&#xff0c;所有的数据都存放在表空间中。默认情况下&#xff0c;InnoDB存储引擎有一个共享表空间idbdata1&#xff0c;即所有数据都存放在这个表…