c++编程实践—利用CMake进行版本控制

📅 发布时间:2026/7/8 12:53:12 👁️ 浏览次数:
c++编程实践—利用CMake进行版本控制
一、版本号管理在实际的项目开发中不同的软件、库以及独立的开发模块等等都需要一个显式的版本匹配。这种匹配机制既可以防止依赖的各方因为协同配合不一致导致工程实施上的版本问题。而且在出现问题后也可以很快的定准大致的范围。而一般情况下会使用版本号来代表某个版本。在正规的软件项目中大家都可以在软件后面看到长长的软件版本ID这种ID的定义有几种方式自定义这种方式非常灵活但可能无法为外界认可或者在应用时可能不适应一些具体的应用场景行企业定义本质上这种和自定义区别不大但在大中型企业或行业领域中可能也是有严格的标准的整体上要比自定义要进步一大截国家或国际标准这种版本管理的机制就很标准比如在某些行业如医药都有国家的版本管理标准。这种标准更适合高层次的版本管理控制当然具体到版本管理号的形式也很灵活既可以直接用自然语言描述也可以使用类似时间等标签进行版本说明。这种内容上的细节定义就需要具体的管理者制定了。当然也可以把版本ID的描述搞成一个集合这就见仁见智了。二、软件版本的推出形式软件的版本迭代可能会因为各种情况有所不同。一般来说软件的发布主要分为以下几种方式持续交付这种情况适合于敏捷编程或互联网应用中的情况需要快捷的不断迭代固定时间交付这种也比较常见在一些专业的领域每积累一段时间后进行一次完善和相关的升级按需发布这种情况比较常见于互联网公司中特别是一些漏洞和补丁的完善和升级随着软件互相依赖的日益严重以及软件规模化的不断扩大一般现在的版本管理已经通过相关的工具来进行处理版本号的迭代也由工具来进行处理。但在不少的情况下还是有需要手动来进行控制的。三、CMake进行版本号控制在C开发中如果使用CMake进行开发那么就可以借助CMake进行版本号的管理。这样就可以通过CMake来自动的进行相关的ID的集成控制以及交付到CI/CD的控制中。这里提供一种最基础的版本号管理方式通过这种机制可以很快明白相关的应用方法。在CMake有几种方式来处理版本号的控制直接指定在CMakeLists.txt中直接指定如下形式set(PROJECT_VERSION_MAJOR 0) set(PROJECT_VERSION_MINOR 0) set(PROJECT_VERSION_PATCH 10) set(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH})或project(${exeTarget} LANGUAGES CXX VERSION 0.0.10)版本文件设定可以编写一个版本文件如version.txt然后在CMake中进行读取处理# 读取版本信息 file(READ ${CMAKE_CURRENT_SOURCE_DIR}/VERSION.txt VERSION_STRING) string(STRIP ${VERSION_STRING} VERSION_STRING) # 处理 string(REPLACE . ; VERSION_LIST ${VERSION_STRING}) list(GET VERSION_LIST 0 PROJECT_VERSION_MAJOR) list(GET VERSION_LIST 1 PROJECT_VERSION_MINOR) list(GET VERSION_LIST 2 PROJECT_VERSION_PATCH) project(MyProject VERSION ${VERSION_STRING})version.txt内容:0.1.10配置文件自动生成可以由一个配置文件来自动生成这样会更容易管理。先定义一个版本管理的头文件如名字叫做version.hpp.in,其内容如下#pragma once #include string_view namespace SIHO::VERSION { constexpr int major { PROJECT_VERSION_MAJOR }; constexpr int minor { PROJECT_VERSION_MINOR }; constexpr int patch { PROJECT_VERSION_PATCH }; constexpr std::string_view gitcommit{ GIT_HASH} ; constexpr std::string_view full{vPROJECT_VERSION-BUILD_TIME-GIT_HASH}; }在CMakeLists.txt文件中增加#SELF_DIR等为项目中的配置路径宏也可以直接固定文件路径但就不灵活了 configure_file(${SELF_DIR}/version.hpp.in ${SELF_DIR1}/version.hpp ONLY)其最终编译出来的类似下面的形式#pragma once #include string_view namespace SIHO::VERSION { constexpr int major { 0 }; constexpr int minor { 0 }; constexpr int patch { 10 }; constexpr std::string_view gitcommit{ b945c26} ; constexpr std::string_view full{v0.0.10-251112_145252-b945c26}; }四、总结当然在CMake中对不同目标如库的设置都可以通过具体的接口来进行处理。不同的平台其对版本文件的处理习惯也有所不同另外还可以对版本号的自动递增进行处理等CMake的功能还是相当强大的。限于篇幅本文就只抛砖引玉提出一个最小的原型来进行说明。