# CMake 构建的时候自动根据git提交生成版本号

很常见的版本需求


# 1. 在 CMake 中获取 Git 提交次数

CMakeLists.txt 里加入:

# 获取提交次数
execute_process(
    COMMAND git rev-list --count HEAD
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
    OUTPUT_VARIABLE GIT_COMMIT_COUNT
    OUTPUT_STRIP_TRAILING_WHITESPACE
)

set(MAJOR_VERSION 1)
set(MINOR_VERSION 0)
set(PATCH_VERSION ${GIT_COMMIT_COUNT})

set(FULL_VERSION "${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}")
message(STATUS "Project version: ${FULL_VERSION}")

# 2. 把版本号作为宏传给 C++

add_executableadd_library 后面添加:

add_executable(myapp main.cpp)

# 传递版本号给 C++ 代码
target_compile_definitions(myapp PRIVATE
    PROJECT_VERSION="${FULL_VERSION}"
    PROJECT_VERSION_MAJOR=${MAJOR_VERSION}
    PROJECT_VERSION_MINOR=${MINOR_VERSION}
    PROJECT_VERSION_PATCH=${PATCH_VERSION}
)

# 3. 在 C++ 中使用

main.cpp 里:

#include <iostream>

int main() {
    std::cout << "Version: " << PROJECT_VERSION << std::endl;
    std::cout << "Major: " << PROJECT_VERSION_MAJOR << std::endl;
    std::cout << "Minor: " << PROJECT_VERSION_MINOR << std::endl;
    std::cout << "Patch: " << PROJECT_VERSION_PATCH << std::endl;
    return 0;
}

编译输出示例:

Version: 1.0.123
Major: 1
Minor: 0
Patch: 123

# 4. 进阶(推荐)

如果希望在代码里 #include "version.h" 直接使用宏,可以让 CMake 自动生成 version.h

configure_file(
    ${CMAKE_SOURCE_DIR}/version.h.in
    ${CMAKE_BINARY_DIR}/generated/version.h
    @ONLY
)

target_include_directories(myapp PRIVATE ${CMAKE_BINARY_DIR}/generated)

version.h.in 内容:

#pragma once

#define PROJECT_VERSION "@FULL_VERSION@"
#define PROJECT_VERSION_MAJOR @MAJOR_VERSION@
#define PROJECT_VERSION_MINOR @MINOR_VERSION@
#define PROJECT_VERSION_PATCH @PATCH_VERSION@

这样编译时会生成 version.h,代码里直接:

#include "version.h"
std::cout << PROJECT_VERSION << std::endl;

Last Updated: 8/16/2025, 9:37:55 PM