CMake中if条件无法处理变量与预定义符号的逻辑与问题咨询
CMake条件判断语法错误原因分析
问题代码
project(MinimalWorkingExample) if(NOT WIN32 AND WIN32) message("If branch!!") else() message("Else branch!!") endif() if(${ENABLE_COVERAGE}) message("If branch 2!!") else() message("Else branch 2!!") endif() if(${ENABLE_COVERAGE} AND ${ENABLE_COVERAGE}) message("If branch 3!!") else() message("Else branch 3!!") endif() if(NOT WIN32 AND NOT WIN32) message("If branch 4!!") else() message("Else branch 4!!") endif() if(NOT WIN32) if(${ENABLE_COVERAGE}) message("If-If branch!!") else() message("If-Else branch!!") endif() else() if(${ENABLE_COVERAGE}) message("Else-If branch!!") else() message("Else-Else branch!!") endif() endif() if(NOT WIN32 AND ${ENABLE_COVERAGE}) message("Last branch") endif()
执行输出(Windows + CMake 3.24.2)
Else branch!! Else branch 2!! Else branch 3!! Else branch 4!! Else-Else branch!! CMake Error at CMakeLists.txt:36 (if): if given arguments: "NOT" "WIN32" "AND" Unknown arguments specified
错误原因
根本问题不是不允许预定义符号和自定义变量组合,而是你引用变量的方式错误:
- 当你使用
${ENABLE_COVERAGE}时,如果这个变量未被定义,CMake会把它展开成空字符串。 - 最后一个条件
if(NOT WIN32 AND ${ENABLE_COVERAGE})就会被解析为if(NOT WIN32 AND),这不符合CMake的if语法——逻辑运算符AND需要左右两个完整的操作数,缺少右侧操作数就会触发语法错误。
而之前的if(${ENABLE_COVERAGE})能运行是因为CMake允许空的if()条件(视为假),但一旦和逻辑运算符组合,空值就会破坏表达式的语法结构。
正确写法
CMake的if命令可以直接识别变量,不需要手动用${}展开:
# 正确的条件写法 if(NOT WIN32 AND ENABLE_COVERAGE) message("Last branch") endif()
这样即使ENABLE_COVERAGE未定义,CMake会将其视为逻辑假,表达式会被正确解析为NOT WIN32 AND FALSE,不会出现语法错误。
内容的提问来源于stack exchange,提问作者Fabian
相关产品推荐
相关产品推荐

