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

【C++动态版本号生成方案:实现类似C# 1.0.* 的自动构建号】

C++动态版本号生成方案:实现类似C# 1.0.* 的自动构建号

在C#中,1.0.*版本号格式会在编译时自动生成构建号和修订号。本文将介绍如何在C++项目中实现类似功能,通过MSBuild自动化生成基于编译时间的版本号。

实现原理

  1. 版本号构成主版本.次版本.构建号.修订号
  2. 自动生成规则
    • 构建号:从2000-01-01到编译日期的天数
    • 修订号:当天经过的秒数/2(与C#算法一致)

实现步骤

1. 创建版本资源文件

项目目录->资源文件->右键->添加->资源->Version

在这里插入图片描述

选中资源文件->右键->查看代码,
在打开的.rc文件中添加版本值指向宏信息定义:MY_FILE_VERSION MY_PRODUCT_VERSION

/////////////////////////////////////////////////////////////////////////////
//
// Version
//
#ifndef MY_FILE_VERSION
#define MY_FILE_VERSION     861,3005,3314,98
#define MY_PRODUCT_VERSION  861,3005,3314,98
#endifVS_VERSION_INFO VERSIONINFO
FILEVERSION MY_FILE_VERSION
PRODUCTVERSION MY_PRODUCT_VERSION
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x2L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "080404b0"
BEGIN
VALUE "CompanyName", "BetaTech"
VALUE "FileDescription", "Beta.Core.AbstractBase"
VALUE "FileVersion", "1.0.0.0"
VALUE "InternalName", "Beta.Core"
VALUE "LegalCopyright", "Copyright (C) 2018"
VALUE "OriginalFilename", "Beta.Core"
VALUE "ProductName", "Beta.Core.AbstractBase"
VALUE "ProductVersion", "1.0.0.0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x804, 1200
END
END
#endif    // resources
/////////////////////////////////////////////////////////////////////////////

2. 编写MSBulid的Target

选中项目->右键卸载项目->显示已卸载->双击项目->打开xxx.vcxproj文件

在文件开头,Project节点内添加一个Target节点。内容如下

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><!-- 构建前:创建资源宏定义修改版本号 --><Target Name="UpdateVersionBeforeBuild" BeforeTargets="BeforeClCompile"><PropertyGroup><BaseDate>$([System.DateTime]::new(2000, 1, 1))</BaseDate><Now>$([System.DateTime]::Now)</Now><Days>$([System.DateTime]::op_Subtraction($(Now), $(BaseDate)).Days)</Days><TimeOfDay>$([System.DateTime]::Now.TimeOfDay)</TimeOfDay><TotalSeconds>$([System.TimeSpan]::Parse($(TimeOfDay)).TotalSeconds)</TotalSeconds><Seconds>$([System.Math]::Floor($([MSBuild]::Divide($(TotalSeconds), 2))))</Seconds><NewVersion>1,0,$(Days),$(Seconds)</NewVersion><NewResPreprocessorDefinitions></NewResPreprocessorDefinitions></PropertyGroup><ItemGroup><ResourceCompile><PreprocessorDefinitions>MY_FILE_VERSION=$(NewVersion);MY_PRODUCT_VERSION=$(NewVersion);%(PreprocessorDefinitions)</PreprocessorDefinitions></ResourceCompile></ItemGroup><!-- 打印版本号,输出显示到控制台 --><Message Text="Updating version to: %(ResourceCompile.PreprocessorDefinitions)" Importance="high" /></Target><!-- 此处省略文件原本的内容 --></Project>

3. 保存,重新加载项目,执行重新生成。

保存文件 -> 选中项目 -> 右键 -> 重新加载项目 -> 右键 ->重新生成。

在这里插入图片描述

4.结束

通过这种方式,每次构建都会生成唯一的版本号(如1.0.7890.32456),既保持了版本号的可追溯性,又避免了手动维护版本号的繁琐操作。

http://www.dtcms.com/a/321102.html

相关文章:

  • Ubuntu 系统本地部署 Dify 完整教程
  • MySQL查询语句(会持续更新)
  • Dart关键字完全指南:从基础到高级用法详解
  • [GESP202309 五级] 2023年9月GESP C++五级上机题题解,附带讲解视频!
  • 《Git从入门到精通:告别版本管理混乱》
  • Git 工程迁移指南
  • 如何在 Ubuntu 24.04 LTS 或 22.04/20.04 上安装 Apache Maven
  • ORACLE物化视图快速刷新失败原因查找
  • Oracle 的 exp(传统导出工具)和 expdp(Data Pump 导出工具)是两种命令对比
  • Python合并两个PDF文件
  • 汽车专题 | 视觉AI正在重构整车质检格局
  • OpenAPI(Swagger3)接口文档自定义排序(万能大法,支持任意swagger版本)
  • 基于AI MCP协议, 写一个MCP服务用于连接数据库执行sql
  • PostgreSQL技术大讲堂 - 第100讲:玩转PG数据库对象权限卷之迷宫
  • Langchain入门:构建一个基于SQL数据的问答系统
  • DM8数据库服务正常,但是登录报错 [-70019]:没有匹配的可登录服务器
  • 项目历程—可视化文件系统
  • ESP32-menuconfig(2) -- Application manager
  • MyBatis SQL映射与动态SQL:构建灵活高效的数据访问层 MyBatis SQL映射与动态SQL:构建灵活高效的数据访问层
  • wodpress结构化数据对SEO的作用
  • 【重磅发布】flutter_chen_keyboard -专注于键盘相关功能
  • Flutter多引擎架构下原生通信的模块化封装与性能优化
  • Spring AI将存量接口转化为MCP服务(附源码)
  • MES系统是什么?从核心功能到行业应用,打造智能制造新引擎
  • nlp-语义分析
  • 全面了解svm
  • 从零开始将项目镜像部署到离线Windows服务器的完整流程
  • ADB打印设备日志相关
  • GPT-5 全面解析与 DeepSeek 实战对比:推理、工具调用、上下文与成本
  • 十三、抽象队列同步器AQS