基于CMAKE_CONFIGURATION_TYPES为VS各配置设置预处理器定义的方法
CMake多配置生成器按配置定义预处理器的正确方法
针对Visual Studio这类多配置生成器,有两种常用的实现方案:
方案1:使用生成器表达式(最推荐)
生成器表达式是CMake专门为适配多配置场景设计的语法,会在构建系统生成阶段根据配置动态求值,同时兼容单/多配置生成器。
如果是给指定目标添加私有预处理器定义:
# 替换your_target为你实际的目标名 target_compile_definitions(your_target PRIVATE # Debug配置生效的宏 $<$<CONFIG:Debug>:YOUR_CUSTOM_DEBUG_MACRO> # Release配置生效的宏 $<$<CONFIG:Release>:YOUR_CUSTOM_RELEASE_MACRO> )
如果需要给全局所有目标添加预处理器定义:
add_compile_definitions( $<$<CONFIG:Debug>:GLOBAL_DEBUG_MACRO> $<$<CONFIG:Release>:GLOBAL_RELEASE_MACRO> )
方案2:修改配置对应的编译标志变量
你也可以直接修改对应配置的全局编译标志变量来添加预处理器定义,以C++项目为例:
# 给Debug配置的C++编译选项加宏定义 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /DYOUR_DEBUG_MACRO") # 给Release配置的C++编译选项加宏定义 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /DYOUR_RELEASE_MACRO")
注意:该方法Windows下VS用
/D加宏,如果要跨Linux/macOS平台需要换成-D,兼容性不如生成器表达式方案。
注意事项
- 你当前设置
CMAKE_CONFIGURATION_TYPES的代码需要放到project()命令之前执行,否则配置不会生效。 - 不要尝试用普通的
if判断去匹配生成器表达式,if是在CMake配置阶段执行的,此时生成器表达式还未求值,只会被识别为普通字符串。
内容的提问来源于stack exchange,提问作者Kirill Daybov
相关产品推荐
相关产品推荐

