Cmake 在生成器表达式中正确使用平台变量

Cmake 在生成器表达式中正确使用平台变量,cmake,Cmake,我广泛使用了cmake变量,例如: if (${WIN32) ... endif() 但是,我不知道如何在生成器表达式中正确使用WIN32变量。我天真地试过: target_link_libraries(mytarget PUBLIC $<$<AND:${SOME_DEPENDENCY_ENABLED}, ${WIN32}>:bcrypt> $<$<AND:${SOME_OTHER_DEPENDENCY_ENAB

我广泛使用了cmake变量,例如:

if (${WIN32)
   ...
endif()
但是,我不知道如何在生成器表达式中正确使用
WIN32
变量。我天真地试过:

target_link_libraries(mytarget
    PUBLIC
        $<$<AND:${SOME_DEPENDENCY_ENABLED}, ${WIN32}>:bcrypt>
        $<$<AND:${SOME_OTHER_DEPENDENCY_ENABLED}, ${WIN32}>:wsock32>
)
target\u链接库(mytarget)
公开的
$
$
)
这将导致cmake错误:

CMake Error:
  Error evaluating generator expression:

    $<AND:OFF,>

  Parameters to $<AND> must resolve to either '0' or '1'.
CMake错误:
计算生成器表达式时出错:
$
$的参数必须解析为“0”或“1”。
我知道问题在于当目标系统是Windows时,
WIN32
设置为
True
,但如果不是,则设置为
False
。因此,在非Windows系统上,生成器表达式扩展为无效表达式


在生成器表达式中使用
WIN32
True
False
的正确方法是什么?

如果变量
var
可以通过
If(${var})
If(var)
进行检查,则使用表达式

$<BOOL:${var}>

还请注意,生成器表达式不打算用作任何
如果
条件的替换


生成器表达式的主要用途是创建依赖于配置类型(发布、调试等)特定的事物(变量、属性)的条件。由于在多配置生成器上,当读取
CMakeLists.txt
时,配置类型未知,因此不能对此类变量和属性使用普通
if

如果变量
var
可以使用
if(${var})
if(var)
进行检查,则使用表达式

$<BOOL:${var}>

还请注意,生成器表达式不打算用作任何
如果
条件的替换

生成器表达式的主要用途是创建依赖于配置类型(发布、调试等)特定的事物(变量、属性)的条件。由于在多配置生成器上,当读取
CMakeLists.txt
时,配置类型未知,因此不能对此类变量和属性使用普通
if

if(WIN32)
  # use value 'bcrypt'
else()
  # use empty value
endif()