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,还没试过其他版本,不知道是不是有同样的问题。

<think>首先,用户的问题是:“我想解决CMake版本过低的警告问题请问CMakeDeprecationWarningcmake_minimum_required兼容性低于3.10解决方案”。所以,用户遇到了一个警告,指出cmake_minimum_required指定的版本低于3.10,需要解决方案。从系统级指令中,我需要:-所有行内数学表达式使用$...$格式。-独立公式使用$$...$$格式并单独成段。-LaTeX语法正确。-使用中文回答。-生成相关问题。-回答中引用的段落末尾自然地添加引用标识,例如[^1]。用户可见层指令:-回答结构清晰,帮助用户逐步解决问题。-保证回答真实可靠。参考站内引用:-引用[1]:在Makefile.txt中要求最低Cmake版本修改的例子。-引用[2]:关于cmake_minimum_required命令的说明。-引用[3]:顶层CMakeLists.txt的设置示例。用户的问题是解决CMake版本过低的警告。警告是关于cmake_minimum_required指定的版本低于3.10。解决方案的核心是更新CMakeLists.txt文件中的cmake_minimum_required命令,指定一个更高的版本,如3.10或更高。步骤:1.检查当前系统安装的CMake版本。使用命令:cmake--version2.修改CMakeLists.txt文件中的cmake_minimum_required行,设置版本为3.10或更高。3.确保cmake_minimum_required在文件顶部调用,甚至在project()之前。4.测试构建以确认警告消失。从引用[1]中:用户修改了版本从2.8.12到3.8.0或指定范围2.8.12...3.10.0。从引用[2]中:强调在顶级CMakeLists.txt开头调用cmake_minimum_required,在调用其他命令之前。从引用[3]中:示例使用cmake_minimum_required(VERSION3.10)所以,在回答中:-结构清晰:逐步指导用户。-使用中文。-生成相关问题。生成相关问题:-系统指令要求生成相关问题,在回答末尾添加类似示例中的"§§相关问题§§"部分。回答结构:1.解释问题:简要说明警告的原因。2.解决方案步骤:列出清晰步骤。3.示例:提供修改后的代码片段。4.注意事项:引用相关信息。5.相关问题:生成几个相关问题。确保LaTeX:用户问题不涉及数学公式,所以可能不需要使用数学表达式。但如果有变量,比如版本号,可能使用行内$...$,但这里可能不需要。保持简单。最终回答大纲:-开头:解释警告。-步骤:a.检查系统CMake版本。b.修改CMakeLists.txt。c.位置和语法。d.测试。-示例代码。-引用站内信息。-相关问题。</think>### 解决CMake Deprecation Warning: cmake_minimum_required兼容性低于3.10 当您在运行CMake时遇到类似“Deprecation Warning: cmake_minimum_required(VERSION ...) is less than 3.10”的警告时,这表示您的CMakeLists.txt文件中指定的最低CMake版本过低,与新版本的CMake策略不兼容。警告通常源于CMake的策略机制:版本低于3.10时,某些旧行为已被弃用,可能导致构建问题[^2]。以下是结构清晰的解决方案步骤,基于您的需求和相关引用。 #### 解决方案步骤 1. **检查系统CMake版本** 首先,确认您系统中安装的CMake版本。在终端运行以下命令: ```bash cmake --version ``` 输出类似“cmake version 3.30.3”,表明您的系统支持更高版本(如3.10+)。如果版本低于3.10,您需要先升级CMake(如通过包管理器安装)。 2. **修改CMakeLists.txt文件** 在项目根目录的顶级CMakeLists.txt文件中,更新`cmake_minimum_required`命令的版本号。确保将其设置在文件开头(甚至在`project()`命令之前),以正确建立策略设置[^2][^3]: - **修改前示例**(可能触发警告): ```cmake cmake_minimum_required(VERSION 2.8.12) # 版本过低,兼容性差 project(MyProject) ``` - **修改后示例**(推荐使用3.10或更高): ```cmake cmake_minimum_required(VERSION 3.10) # 设置最低版本为3.10或更高 project(MyProject LANGUAGES CXX) ``` - **替代方案**:如果需兼容旧系统,可指定版本范围(如2.8.12...3.10.0),但这可能仍有警告[^1]。 ```cmake cmake_minimum_required(VERSION 2.8.12...3.10.0) ``` 3. **验证和测试** - 保存文件后,重新运行CMake生成构建文件: ```bash cmake -S . -B build ``` - 检查输出是否不再显示弃用警告。如果警告消失,表明问题已解决。 - **注意**:如果项目中包含子模块(如`add_subdirectory(module)`),确保每个子模块的CMakeLists.txt也遵循此规则,但通常只在顶级文件中设置一次[^3]。 #### 关键注意事项 - **位置要求**:`cmake_minimum_required`必须在顶级CMakeLists.txt文件的最顶部调用,以优先于其他命令(如`project()`),避免策略冲突[^2]。 - **版本选择**:建议使用与系统版本匹配的值(如系统是3.30.3,则设置`VERSION 3.10`或更高)。常见兼容版本包括3.10、3.12或3.15。 - **潜在风险**:升级版本后,如果项目依赖旧特性(如过时的宏),可能需调整代码。但3.10+版本通常向下兼容。 - 参考引用:在CMake官方文档中,`cmake_minimum_required`用于确保策略一致性,避免弃用行为影响构建[^2]。顶级文件的结构应优先设置版本和编译选项[^3]。 通过以上步骤,警告问题应被解决。如果仍有问题,请提供完整CMakeLists.txt内容以便进一步分析。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

10km

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

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

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

打赏作者

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

抵扣说明:

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

余额充值