思路
在C++项目中,为了方便日志管理,我们通常希望日志包含一个tag,用于标识日志的来源,追踪代码版本
- 在 CMake 配置阶段用 git describe拿到版本号,注入到 C++ 编译(宏或生成头文件)。
- 在 main 中打印该常量(或用 RCLCPP_INFO 打日志)。
- 注意:版本号在“配置阶段”计算,只有在 CMake 重新配置时才会更新(比如改 tag/commit 后需要触发 reconfigure)。
方案一(推荐):生成头文件注入版本号
- 优点:字符串转义安全;可多处包含使用;可读性好。
- 做法:
- 保留你现有的 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}")
- 新增一个头文件模板 include/your_project/git_version.hpp.in:
#pragma once
inline constexpr const char* NAV_GIT_VERSION = "@GIT_VERSION@";
- 在 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)
- 修改 main.cpp 引入并打印:
#include "git_version.hpp"
// ...
std::cout << "导航版本号 " << HRIC_GIT_VERSION << std::endl;
- 构建并运行:
colcon build --packages-select your_project --cmake-force-configure
- 更新版本号的注意点:
- 改动 tag/commit 后需要让 CMake 重新配置,常用方式:在colcon build后加"–cmake-force-configure",如上面的命令所示
方案二:直接用编译宏注入(不生成文件)
- 优点:更少文件;改动小。
- 缺点:宏字符串转义要注意;可读性略差于方案一。
- 做法:
- 在 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;
- 构建并运行:
colcon build --packages-select your_project --cmake-force-configure


2198

被折叠的 条评论
为什么被折叠?



