小技巧|在日志中打印代码Git的版本号(tag)

思路

在C++项目中,为了方便日志管理,我们通常希望日志包含一个tag,用于标识日志的来源,追踪代码版本

  • 在 CMake 配置阶段用 git describe拿到版本号,注入到 C++ 编译(宏或生成头文件)。
  • 在 main 中打印该常量(或用 RCLCPP_INFO 打日志)。
  • 注意:版本号在“配置阶段”计算,只有在 CMake 重新配置时才会更新(比如改 tag/commit 后需要触发 reconfigure)。

方案一(推荐):生成头文件注入版本号

  • 优点:字符串转义安全;可多处包含使用;可读性好。
  • 做法:
  1. 保留你现有的 CMake 取版本逻辑:
  • 在CMAKELIST文件中添加:
       find_package(Git REQUIRED)
       execute_process(
           COMMAND ${GIT_EXECUTABLE} describe --tags --always --dirty
           WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
           OUTPUT_VARIABLE GIT_VERSION
           OUTPUT_STRIP_TRAILING_WHITESPACE
       )
       message(STATUS "Git version: ${GIT_VERSION}")
  1. 新增一个头文件模板 include/your_project/git_version.hpp.in:
#pragma once
     inline constexpr const char* NAV_GIT_VERSION = "@GIT_VERSION@";
  1. 在 CMakeLists.txt 里生成头文件并加到包含路径(放在创建可执行文件之后(这里以nav_node为例)):
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/include/hric_nav_manager/git_version.hpp.in
                    ${CMAKE_CURRENT_BINARY_DIR}/generated/git_version.hpp
                    @ONLY)
     target_include_directories(nav_node PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/generated)
  1. 修改 main.cpp 引入并打印:
    #include "git_version.hpp"
     // ...
     std::cout << "导航版本号 " << HRIC_GIT_VERSION << std::endl;
  1. 构建并运行:
colcon build --packages-select your_project --cmake-force-configure
  • 更新版本号的注意点:
  • 改动 tag/commit 后需要让 CMake 重新配置,常用方式:在colcon build后加"–cmake-force-configure",如上面的命令所示

方案二:直接用编译宏注入(不生成文件)

  • 优点:更少文件;改动小。
  • 缺点:宏字符串转义要注意;可读性略差于方案一。
  • 做法:
  1. 在 CMakeLists.txt(创建可执行文件之后)加入:
     target_compile_definitions(hric_nav_manager_node PRIVATE HRIC_GIT_VERSION="${GIT_VERSION}")

注意这里包含了双引号,最终会传给编译器形如 -DHRIC_GIT_VERSION=“v1.2.3”.
2. 在 main.cpp 直接使用:

 // 无需再声明常量
 std::cout << "导航版本号 " << HRIC_GIT_VERSION << std::endl;
  1. 构建并运行:
colcon build --packages-select your_project --cmake-force-configure
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值