CMake通过命令行传递定义宏失效问题求助
问题解决:CMake传递VAR=ON后C++ #if始终走#else分支
问题根源很明确:你通过cmake -DVAR=ON传递的是CMake的布尔值,当用add_definitions("-DVAR=${VAR}")时,CMake会把布尔值ON展开成字符串**"ON"**,最终传给编译器的参数是-DVAR=ON。而C++的#if VAR是判断整数常量表达式,这里VAR被定义为字符串"ON",预处理阶段会被解析为0,所以永远执行#else分支。
给你几个直接有效的解决办法:
修改CMake,将布尔值转为整数
用CMake的生成器表达式自动把ON/OFF转成1/0,写法最简洁:add_definitions(-DVAR=$<BOOL:${VAR}>)或者用条件判断手动处理:
if(VAR) add_definitions(-DVAR=1) else() add_definitions(-DVAR=0) endif()推荐:使用现代CMake的target_compile_definitions
add_definitions是全局生效的老写法,更规范的是用目标级别的定义,避免污染全局:# 替换成你的实际目标名称(比如可执行文件/库的名字) target_compile_definitions(your_target PRIVATE VAR=$<BOOL:${VAR}>)修改C++代码的判断逻辑(不推荐,仅作备选)
如果不想动CMake,可以调整预处理判断,直接识别字符串"ON":#if defined(VAR) && (VAR == ON || VAR == 1) // do this #else // do this #endif
内容的提问来源于stack exchange,提问作者user22921298
相关产品推荐
相关产品推荐

