如何将CMake中的宏值传递给C++变量,无需使用配置文件
实现方案(无需配置文件)
你当前使用的编译定义注入方式本身就可以实现需求,仅需要调整两处写法即可:
- 修改CMake侧的宏定义写法
需要把PROJECT_VERSION的值包裹为字符串格式再注入,否则C++侧会把版本号识别为数值表达式而非字符串:
# 如果你要全局生效可以保留add_compile_definitions,建议优先给指定目标加定义避免污染 # 全局写法 add_compile_definitions(PROJECT_VERSION="${PROJECT_VERSION}") # 更推荐的目标级写法,替换为你实际的编译目标名即可 # target_compile_definitions(your_target_name PRIVATE PROJECT_VERSION="${PROJECT_VERSION}")
- 调整C++侧的调用写法
你写的@PROJECT_VERSION@是CMake配置文件专属的占位符,不需要配置文件的场景下无需使用,直接调用注入的宏即可:
#include <iostream> #ifdef PROJECT_VERSION const char* const project_version = PROJECT_VERSION; #else const char* const project_version = "unknown"; #endif int main() { std::cout << "Version: " << project_version << std::endl; return 0; }
注意事项
- 不需要额外新增
#define version "@PROJECT_VERSION@"的逻辑,这段代码仅在使用configure_file生成头文件的场景下才会被CMake替换生效,你当前的方案里这段代码不会工作 - 优先使用
target_compile_definitions而非全局的add_compile_definitions,避免给不需要版本号的编译目标引入多余宏定义
内容的提问来源于stack exchange,提问作者Pat cm pro
相关产品推荐
相关产品推荐

