Cmake 在生成器表达式中正确使用平台变量
我广泛使用了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
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()