问题

常常排查 bug 时,不知道当前运行的可执行文件到底是哪个版本代码编译出来的,无法快速判断需要修改哪一份代码。因此需要输出可执行文件的源码 git commit 版本信息,定位代码版本。

解决方法

原理:cmake 时获取当前代码库的 git 信息并传入可执行文件。
注意事项:编译环境里需要有 git,完全重新 cmake-make 编译才能更新 git 信息。

1. cmake 中获取 git version

CMakeLists.txt 内容如下

project(version_ctl)

add_executable(
    ${PROJECT_NAME}
    src/main.cpp
)

# 获取 Git 版本信息
execute_process(
    COMMAND git rev-parse HEAD
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    OUTPUT_VARIABLE GIT_VERSION
    OUTPUT_STRIP_TRAILING_WHITESPACE
)
# 将 Git 版本信息传递给编译器
target_compile_definitions(
    ${PROJECT_NAME}
    PRIVATE
    GIT_VERSION="${GIT_VERSION}"
)
# 输出获取的 Git 版本信息
message(STATUS "Git Version: ${GIT_VERSION}")

2. 程序中输出 git version

main.cpp 内容如下

#include <cstdio>
#include <string>

int main(int argc, char** argv) {
    // 有且只有 -v 参数时,输出短 git commit 版本和完整 git commit 版本
    if (argc == 2 && std::string(argv[1]) == "-v") {
        printf("git version: %.7s, %s", GIT_VERSION, GIT_VERSION);
        return 0;
    }

    // 其他内容

    return 0;
}

3. 运行效果

./version_ctl -v
git version: 8085844, 80858442e6b42ad4dd9963fdd40636d29fced4ba
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐