CMake中if(DEFINED)判断失效问题求助
嘿,我来帮你排查这个CMake的问题!从你给出的输出看,TARGET_BUILDTYPE已经正确生成了DSE_UTILITIES_BUILDTYPE,但if(DEFINED)判断却没生效,触发了错误。咱们一步步来分析解决:
1. 先确认目标变量真的存在
首先要搞清楚:DSE_UTILITIES_BUILDTYPE这个变量到底有没有在当前的CMake作用域里定义?你可以在if(DEFINED...)之前加一段调试代码,直接列出所有匹配的变量:
# 调试:列出所有和目标变量名匹配的变量 get_cmake_property(all_vars VARIABLES) list(FILTER all_vars INCLUDE REGEX "${TARGET_BUILDTYPE}") message("Debug: 找到的匹配变量: ${all_vars}")
如果这段代码输出为空,要么是你根本没定义DSE_UTILITIES_BUILDTYPE,要么是拼写错了(比如大小写、下划线位置不对)。如果变量存在但不在当前作用域(比如是在父目录或者其他函数里定义的),那你可能需要调整变量的作用域,比如用PARENT_SCOPE来传递,或者确保变量能被当前代码访问到。
2. 检查变量名有没有隐藏字符
有时候变量名可能不小心带了空格、不可见字符,导致匹配失败。你可以打印变量名的长度和原始内容来验证:
string(LENGTH "${TARGET_BUILDTYPE}" bt_len) message("Debug: TARGET_BUILDTYPE的长度: ${bt_len}, 原始内容: [${TARGET_BUILDTYPE}]")
正常情况下DSE_UTILITIES_BUILDTYPE的长度是24,如果长度不对,说明有隐藏字符,你可以用下面的代码清理掉非合法的变量名字符:
# 清理变量名中除了大写字母、数字、下划线之外的所有字符 string(REGEX REPLACE "[^A-Z0-9_]" "" TARGET_BUILDTYPE "${TARGET_BUILDTYPE}")
3. 试试换一种方式检查变量存在性
有些旧版本的CMake在处理DEFINED和间接变量引用时可能有小bug,你可以换个写法试试:
# 先把目标变量名存到临时变量里再检查 set(_target_var "${TARGET_BUILDTYPE}") if(DEFINED "${_target_var}") # 你的原有逻辑 endif()
如果是版本问题,升级到CMake 3.15以上的版本通常能解决这类兼容性问题。
4. 修复后的完整代码示例
这里给你一个包含调试和修复的完整代码片段,你可以直接用:
message("TARGET_NAME=${TARGET_NAME}") string(TOUPPER "${TARGET_NAME}_BUILDTYPE" TARGET_BUILDTYPE) message("TARGET_BUILDTYPE=${TARGET_BUILDTYPE}") # 调试:确认目标变量是否存在 get_cmake_property(all_vars VARIABLES) list(FILTER all_vars INCLUDE REGEX "${TARGET_BUILDTYPE}") message("Debug: 匹配到的变量: ${all_vars}") # 清理变量名中的无效字符 string(REGEX REPLACE "[^A-Z0-9_]" "" TARGET_BUILDTYPE "${TARGET_BUILDTYPE}") if(DEFINED ${TARGET_BUILDTYPE}) set(TG_BUILDTYPE ${${TARGET_BUILDTYPE}}) message("TG_BUILDTYPE=\"${TG_BUILDTYPE}\"") else() message( FATAL_ERROR "cm_add_variable_target() was called, but no target type variable is found. 请检查${TARGET_BUILDTYPE}是否在当前作用域中定义。") endif()
内容的提问来源于stack exchange,提问作者Baskara Reddy
相关产品推荐
相关产品推荐

