我在CMake宏中,我这样做:
if ( "${type}" STREQUAL "lib" )
message( "cond OK: ${type}" )
else()
message( "cond KO: ${type}" )
endif()
猜猜它有时输出什么?
cond OK: prg
到底怎么会发生这种情况?
我无法发送整个CMake代码,也无法将问题隔离到一个简短的示例中,因为很明显,如果您将其与您调用的简单宏隔离,它总是正常工作(并显示{ {1}}或message( "cond OK: lib" )
)。当我在我庞大的项目生成时多次进入宏时,它只会出现错误的行为(我无法隔离......)。
答案 0 :(得分:1)
当比较肯定存在的变量值时,使用变量的名称作为&#34的参数;如果"命令,而不是其解除引用的结果。更正确的比较是
if (type STREQUAL "lib")
事情就是在某些流程中"如果"命令尝试取消引用其字符串参数。
,例如右手论证"如果"检查lib
变量是否存在。如果是这样,它使用 lib
变量的值进行比较[这就是为什么使用项目使用的名称与字符串常量相同的变量的不良做法]。 / p>
完整的案例列表,当取消引用尝试占据一席之地时,请参阅" if"命令documentation。
在你的情况下你可以观察
cond OK: prg
如果定义了变量prg
并设置为" lib"。
因为第一个参数(${type}
)被评估为prg
,"如果"检查是否存在具有此名称的变量。因为变量实际存在,所以它的值(" lib")实际上用于比较。这就是为什么比较的结果是真的。