CMake Generator Expression使用变量比较时结果不符合预期
问题分析与解决
你的问题不是CMake生成器表达式(Generator Expression)不支持变量比较,而是变量展开后的字符串与目标字符串格式不匹配,导致比较结果不符合预期。
原因解析
当你使用${TEST_VAR}时,CMake会在配置阶段直接将变量展开为字符串test(不带引号),而生成器表达式里的STREQUAL操作会在生成阶段比较test和"test"(带引号的字符串)——两者内容并不相同,因此返回DIFFERENT。
正确写法示例
你可以通过以下几种方式修正:
方式1:统一两边字符串格式(都不带引号)
add_library(iflib INTERFACE) set(TEST_VAR "test") target_compile_definitions(iflib INTERFACE GEN_EXP=$<IF:$<STREQUAL:${TEST_VAR},test>,"EQUAL","DIFFERENT"> )
方式2:让变量值包含引号,保持两边格式一致
add_library(iflib INTERFACE) set(TEST_VAR "\"test\"") # 转义引号,使变量值为带引号的字符串 target_compile_definitions(iflib INTERFACE GEN_EXP=$<IF:$<STREQUAL:${TEST_VAR},"test">,"EQUAL","DIFFERENT"> )
方式3:使用$<QUOTE>生成器表达式包裹变量
add_library(iflib INTERFACE) set(TEST_VAR "test") target_compile_definitions(iflib INTERFACE GEN_EXP=$<IF:$<STREQUAL:$<QUOTE:${TEST_VAR}>,"test">,"EQUAL","DIFFERENT"> )
以上三种写法都能让STREQUAL的两边字符串完全匹配,最终GEN_EXP会被设置为EQUAL。
内容的提问来源于stack exchange,提问作者SupAl
相关产品推荐
相关产品推荐

