cmake + mingw项目在Windows平台上使用socket相关的功能时,需要链接libws2_32.a否则会报一堆的socket相关接口未定义;
在网上搜索到的方法:
在target_link_libraries(target xxx xxx)中增加:
$<$<BOOL:${MINGW}>:ws2_32>
该句的含义是:如果使用MINGW编译器,则添加 ws2_32
参考下边的说明,可以对它做一下变形,使其判断MINGW并且WIN32
$<$<AND:$<BOOL:${MINGW}>,$<BOOL:${WIN32}>>:ws2_32>
这一句是
$<condition:true_string> $<BOOL:string> $<AND:conditions>
这三个指令的嵌套使用
$<BOOL:string> --- 把string转换为0或1。
最终为0:
-
string
is empty,string
是空的, -
string
is a case-insensitive equal of0
,FALSE
,OFF
,N
,NO
,IGNORE
, orNOTFOUND
, orstring
是不区分大小写的等于0 ,
FALSE,
OFF,
N ,
NO ,
IGNORE
,或NOTFOUND
-
string
ends in the suffix-NOTFOUND
(case-sensitive).string
以后缀结尾-NOTFOUND
(区分大小写)。
最终为1:
其他任何情况。
$<AND:conditions> --- conditions 是以逗号分隔的多个布尔表达式,因为必须有逗号,所以最少要有两个表达式。当所有布尔表达式都为 1 时,$<AND:conditions>最终为 1。
在我们这个例子中:conditions是 $<BOOL:${MINGW}>,$<BOOL:${WIN32}
$<condition:true_string> -- condition是一个条件生成器表达式,当然可能是嵌套的条件表达式。
如果condition
为 1,则最终结果为true_string
,如果计算结果为 0
,最终结果为空字符串。
在我们这个例子中:
$<$<AND:$<BOOL:${MINGW}>,$<BOOL:${WIN32}>>:ws2_32>
用$<BOOL:${MINGW}>检测是否为mingw编译器
用$<BOOL:${WIN32}>检测是否为windows系统
用$<AND: >计算这两个结果
用$<condition:true_string>计算$<AND: >的结果来决定最终是否为 ws2_32
当编译器为mingw,系统为windows时,最终结果为 ws2_32
这是一个cmake的 生成器表达式,参考: