cmake:Parameters to $<AND> must resolve to either ‘0‘ or ‘1‘.

本文探讨了在CMake中使用$<AND>和$<OR>表达式配置编译选项的问题。详细介绍了如何根据不同编译器和构建类型设置特定的编译标志,并解决了表达式中因逗号前的空格导致的错误。

如下是一段简单的cmake脚本,用于设置target的编译选项:
当编译器为msvc,且CMAKE_BUILD_TYPE为Release时,为target添加-arch:AVX2编译选项,
当编译器为gcc,且CMAKE_BUILD_TYPE为Release时,为target添加-mavx2编译选项。

这里用到了$<AND> 表达式(cmake-generator-expressions)

target_compile_options(${_target} PRIVATE 
	$<$<AND:$<C_COMPILER_ID:MSVC>,$<CONFIG:Release>>:-arch:AVX2>
	$<$<AND:$<C_COMPILER_ID:GNU> ,$<CONFIG:Release>>:-mavx2> )

cmake-generator-expressions表达式以前用过很多次了,比较熟练,感觉语法上没啥问题,但实际运行时居然报错了:

CMake Error at src/core/CMakeLists.txt:109 (target_compile_options):
  Error evaluating generator expression:

    $<AND:$<C_COMPILER_ID:GNU>;,$<CONFIG:Release>>

  Parameters to $<OR> must resolve to either '0' or '1'.

代码中用到了两次$<AND>表达式,但第一个正常,第二个却报错。看了半天也没找到问题。实在没办法了,尝试把GNU> ,这里,号前的空格删除(为格式上的美观特意加了空格),通过!

然后尝试$<OR>表达式,也是同样的问题。
结论就是$<OR>,$<AND>表达式中子表达式之间的,号分隔符前不能有空格(后面有空格倒是是可以的)。
仔细想想,$<OR>,$<AND>表达式在实现时每个子表达返回结果是作为一个字符串处理的,如果加了空格,返回的字符串后面就多了个空格,就是不是‘1’‘0’,而是‘1 ’‘0 ’,所以报错 Parameters to $<OR> must resolve to either '0' or '1'.
但为什么在‘,’之后的空格却能被正常处理呢?我觉得这还是个bug。
我用的CMAKE 版本是3.11.1,还没试过其他版本,不知道是不是有同样的问题。

当在 `CMakeLists.txt` 文件第 4 行出现 `CMake Error at CMakeLists.txt:4 (cmake_minimum_required)` 兼容性问题,提示需更新 `VERSION` 参数最小值或使用 `<min>...<max>` 语法时,可以通过以下方法解决: ### 更新 `VERSION` 参数最小值 若当前系统的 CMake 版本高于原 `CMakeLists.txt` 文件中指定的最低版本,可直接将 `VERSION` 参数更新为系统当前使用的 CMake 版本。例如,若系统当前使用的 CMake 版本为 3.28,可将 `CMakeLists.txt` 文件中的 `cmake_minimum_required` 命令修改为: ```cmake cmake_minimum_required(VERSION 3.28) ``` 这样,CMake 在检查版本时,会以 3.28 作为最低版本要求,若系统版本不低于该值,则不会出现版本兼容性错误。 ### 使用 `<min>...<max>` 语法 若需要指定一个版本范围,可使用 `<min>...<max>` 语法。例如,若希望项目在 CMake 3.20 到 3.28 版本之间都能正常构建,可将 `cmake_minimum_required` 命令修改为: ```cmake cmake_minimum_required(VERSION 3.20...3.28) ``` 这种方式能明确指定项目支持的 CMake 版本范围,提高项目的兼容性。 ### 升级系统的 CMake 版本 若系统的 CMake 版本低于 `CMakeLists.txt` 文件中指定的最低版本,可通过以下步骤升级 CMake 版本: 1. 移除原有的 CMake: ```bash sudo apt remove cmake ``` 2.CMake 官方网站(https://cmake.org/download/ )下载合适的安装包。 3. 解压并编译安装: ```bash cd cmake-<version> # <version> 替换为下载的 CMake 版本号 ./configure make sudo make install ``` 4. 验证 CMake 版本: ```bash cmake --version ``` ### 确保 `cmake_minimum_required` 命令位置正确 `cmake_minimum_required` 命令应放在根目录的 `CMakeLists.txt` 文件的第一行,即 `PROJECT()` 命令的上面。若该命令位置不正确,可能会导致 CMake 无法正确识别最低版本要求,从而出现兼容性错误。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值