【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.pswp.cn/bicheng/92837.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/92837.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/92837.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【算法題】:斐波那契數列

用 JavaScript 實現一個 fibonacci 函數&#xff0c;滿足&#xff1a; 輸入 n&#xff08;從0開始計數&#xff09;輸出第 n 個斐波那契數&#xff08;斐波那契數列從 1 開始&#xff1a;1,1,2,3,5,8,13,21…&#xff09; 示例&#xff1a; fibonacci(0) > 1fibonacci(4) &g…

【YOLOv13[基礎]】熱力圖可視化實踐 | 腳本升級 | 優化可視化效果 | 論文必備 | GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM等

本文將進行添加YOLOv13版本的升級版熱力圖可視化功能的實踐,支持圖像熱力圖可視化、優化可視化效果、 可以選擇使用GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM, HiResCAM, LayerCAM, RandomCAM, EigenGradCAM。一個參數即可設置是否顯示檢測框等。 原圖 結果圖

ElasticSearch相關術語介紹

1.RESTful風格程序REST(英文全稱為:"Representational State Transfer")指的是一組架構約束條件和原則。它是一種軟件架構風格&#xff08;約束條件和原則的集合&#xff0c;但并不是標準&#xff09;。 REST通過資源的角度觀察網絡&#xff0c;以URI對網絡資源進行…

《從零構建大語言模型》學習筆記4,注意力機制1

《從零構建大語言模型》學習筆記4&#xff0c;自注意力機制1 文章目錄《從零構建大語言模型》學習筆記4&#xff0c;自注意力機制1前言一、實現一個簡單的無訓練權重的自注意力機制二、實現具有可訓練權重的自注意力機制1. 分步計算注意力權重2.實現自注意力Python類三、將單頭…

昇思+昇騰開發板+DeepSeek模型推理和性能優化

昇思昇騰開發板DeepSeek模型推理和性能優化 模型推理 流程&#xff1a; 權重加載 -> 啟動推理 -> 效果比較與調優 -> 性能測試 -> 性能優化 權重加載 如微調章節介紹&#xff0c;最終的模型包含兩部分&#xff1a;base model 和 LoRA adapter&#xff0c;其中base …

未給任務“Fody.WeavingTask”的必需參數“IntermediateDir”賦值。 WpfTreeView

c#專欄記錄&#xff1a; 報錯 未給任務“Fody.WeavingTask”的必需參數“IntermediateDir”賦值。 WpfTreeView 生成 解決辦法 清理和重新生成項目 完成上述配置后&#xff0c;嘗試執行以下步驟&#xff1a; 清理項目&#xff1a;刪除 bin 和 obj 文件夾。 重新生成項目&…

[Linux]學習筆記系列 -- [arm][lib]

文章目錄arch/arm/lib/delay.cregister_current_timer_delay 注冊當前定時器延遲read_current_timer 讀取當前定時器drivers/clocksource/timer-stm32.cstm32_clocksource_init STM32 平臺上初始化時鐘源https://github.com/wdfk-prog/linux-study arch/arm/lib/delay.c regis…

harbor倉庫搭建(配置https)

目錄 1. 環境準備 2. 配置https的原因 3. 生成ca證書 4. 搭建harbor倉庫 5. 訪問harbor 6. 修改加密算法 1. 環境準備 需要提前安裝docker和docker-compose&#xff0c;harbor倉庫版本越新&#xff0c;對應的docker和docker-compose版本越新。 主機IP192.168.48.19dock…

C++多線程服務器

C多線程服務器 因為自己同時在看多本書&#xff0c;之前看過《TCP/IP 網絡編程》一書&#xff0c;其中有一個自己編寫一個多線程服務器的例子&#xff0c;于是就把代碼直接抄了一變。 在學習網絡編程前需要先了解網絡的7層模型。 具體代碼如下&#xff1a; 服務器端&#xff1a…

【Pandas】常用數據處理技巧

一. 數據讀取 1.pd.to_csv & pd.read_csv 細節&#xff1a; 1.pd.read_csv 需要 ignore_index True or ,index_col0 否則會有列Unnamed0 2.pickle具有更快的讀取速度&#xff0c;與更小的體積。 讀取前N行&#xff08;若不需獲取所有數據&#xff09; pd.read_csv(…

Docker Compose 部署高可用 MongoDB 副本集集群(含 Keepalived + HAProxy 負載均衡)

Docker Compose 部署高可用 MongoDB 副本集集群&#xff08;含 Keepalived HAProxy 負載均衡&#xff09;背景與目標&#x1f4cb; 環境規劃**服務器信息****軟件版本**部署步驟1. 創建目錄結構2、生成 keyFile&#xff08;三臺機器內容必須一致&#xff09;3. 準備 Keepalive…

MySQL(189)如何分析MySQL的鎖等待問題?

分析MySQL的鎖等待問題有助于發現和解決數據庫性能瓶頸。鎖等待問題通常會導致數據庫響應時間變長&#xff0c;影響系統的整體性能。以下是詳細深入的方法和代碼示例&#xff0c;幫助你分析和解決MySQL的鎖等待問題。 一、鎖的類型和概念 在MySQL中&#xff0c;主要有以下幾種鎖…

26.Scikit-learn實戰:機器學習的工具箱

Scikit-learn實戰&#xff1a;機器學習的工具箱 &#x1f3af; 前言&#xff1a;機器學習界的"宜家家具" 還記得第一次逛宜家的感受嗎&#xff1f;琳瑯滿目的家具&#xff0c;每一件都有詳細的說明書&#xff0c;組裝簡單&#xff0c;樣式統一&#xff0c;關鍵是—…

wordpress文章摘要調用的3種方法

以下是WordPress文章摘要的3種調用方法&#xff1a; 1. 使用the_excerpt()函數 這是WordPress自帶的函數&#xff0c;用于調用文章摘要。如果文章有手動填寫的摘要&#xff0c;則會顯示手動摘要;如果沒有手動摘要&#xff0c;WordPress會自動從文章內容中提取前55個單詞作為摘…

java excel轉圖片常用的幾種方法

十分想念順店雜可。。。在 Java 中實現 Excel 轉圖片&#xff0c;常用的方法主要分為兩類&#xff1a;使用商業庫&#xff08;簡單高效但可能收費&#xff09;和使用開源庫組合&#xff08;免費但實現復雜&#xff09;。以下是幾種常用方案及實現思路&#xff1a;一、使用商業庫…

QT項目 -仿QQ音樂的音樂播放器(第五節)

目錄 一、CommonPage界?設置和顯示 二、自定義ListItemBox 三、支持hover效果 四、自定義VolumeTool 五、界面設置 六、頁面創建及彈出 七、繪制三角 一、CommonPage界面設置和顯示 void CommonPage::setCommonPageUI(const QString &title, const QString &imag…

wstool和git submodule優劣勢對比

wstool 和 git submodule 都可以用來管理項目中的外部源代碼依賴&#xff0c;但它們的設計理念、工作流程和適用場景有很大不同。 我們來深入對比一下它們的優勢和劣勢。 核心理念比喻 git submodule&#xff1a;像是在你的汽車設計圖紙中&#xff0c;直接嵌入了另一家公司&…

六、RuoYi-Cloud-Plus OSS文件上傳配置

1.前面我們完成了RuoYi-Cloud-Plus 部署及啟動&#xff0c;此刻已經可以正常訪問。 前面文章的專欄內容在這&#xff0c;感興趣可以看看。 https://blog.csdn.net/weixin_42868605/category_13023920.html 2.但現在雖然已經啟動成功&#xff0c;但有很多功能我們依舊用不了&a…

達夢數據庫日常運維命令

查詢數據庫表空間數據文件使用大小限制DECLARE K INT:(SELECT cast(PAGE()/1024 as varchar)); BEGIN SELECTF."PATH" 數據文件 ,F.CLIENT_PATH,G.NAME 所屬表空間,F.MAX_SIZE||M 文件擴展限制,(CASE F.AUTO_EXTEND WHEN 1 THEN 是 ELSE 否 END) 文件…

使用線性降維方法進行數據降維

在數據科學與機器學習的領域中&#xff0c;維度災難問題經常導致模型的性能下降。線性降維方法是一種常見的技術&#xff0c;用于在保留盡可能多的原始數據特征的同時&#xff0c;減少數據集的維度。這些方法通過將高維數據映射到低維空間來減少特征數量&#xff0c;從而加速模…