首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“cmake_minimum_required(版本3.10)”中的“版本”是什么?

问“cmake_minimum_required(版本3.10)”中的“版本”是什么?
EN

Stack Overflow用户
提问于 2021-10-01 23:46:20
回答 2查看 1.2K关注 0票数 0

我知道以下CMake声明的含义:

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.10)

我只是想知道VERSION部分在语法上是什么

是未引用论点吗?如果这是一个论点,必须有一些其他论点的选择。

但是根据这里的说法,VERSION似乎是cmake_minimum_required()命令的唯一选择。

如果是这样的话,为什么我们甚至需要指定这个参数显式?

根据CMAKE_MINIMUM_REQUIRED_VERSION.,这个命令设置变量这里这里有某种字符串concatenation吗?所以我可以使用set_minimum_required(XXX <some_value>)发送一个名为CMAKE_MINIMUM_REQUIRED_XXX的任意变量到?

加1

我刚刚在CMakeLists.txt中尝试使用下面的语句

代码语言:javascript
复制
cmake_minimum_required(XXX 123)

cmake抱怨说:

代码语言:javascript
复制
CMake Error at CMakeLists.txt:2 (cmake_minimum_required):
  cmake_minimum_required called with unknown argument "XXX".

所以这似乎是一场争论。

但是根据这里的project()命令,类似的VERSION字符串被指定为选项。看上去有点矛盾。

加2

我刚刚在CMakeLists.txt中尝试使用下面的语句

代码语言:javascript
复制
cmake_minimum_required(3.10)

cmake抱怨说:

代码语言:javascript
复制
CMake Error at CMakeLists.txt:1 (cmake_minimum_required):
  cmake_minimum_required called with unknown argument "3.10".

因此,CMake似乎依赖于VERSION部分来正确解释"3.10“参数。所以我想VERSION也是一种选择。

而且,由于还有另一个可能的选项FATAL_ERROR,所以有必要有一个VERSION选项。

因此,总结一下我目前的理解::

CMake语言的基本范式是:

CMake命令只是根据参数和选项来操作变量。

有些变量是必需的才能被操作,有些是可选的。

  • 对于必需的值,它们的值是通过参数指定的。(有点像位置论点)
  • 对于可选选项,它们的值是通过相应选项后面的参数指定的。(有点像命名的论点)

加3

来自这里,用于VERSION in cmake_minimum_required()

这个版本是这个函数的一个特殊的关键字。并且版本的值在关键字后面。

所以这里它叫做关键字而不是选项..。

加4

一些感情关于CMake..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-03 08:12:28

我认为CMake命令的输入可以分为3种类型:

  1. 关键字参数(也称为选项)
  2. 位置论证
  3. 变量参数(如C中的... )

对于1,类似于VERSION in cmake_minimum_required,它的值紧跟在它后面。它被称为关键字或选项。

对于2,这种参数有一个正式的名称,并通过该名称在命令体中引用。

对于3,可以使用ARGV、ARGN、ARGVC引用该参数。

我还在某个地方看到了marker argument。但我忘了在哪。可怕的语法..。

加1

好的,我找到了marker argument。它在掌握CMake一书中由CMake团队编写:

​

​

...while,CMake官方文件说这是一个选项

搜索路径选项或命令的简短版本指定的路径。这些通常是硬编码的猜测。

多么混乱的措辞..。

票数 0
EN

Stack Overflow用户

发布于 2021-11-03 08:20:13

“cmake_minimum_required(版本3.10)”中的“版本”是什么? 我只是想知道版本部分在语法上是什么?

一根绳子。VERSION。没有什么特别事情。

这是一个未被引用的论点吗?

是。

为什么我们甚至需要明确地指定这个参数呢?

以保持前向兼容性。例如,我们的想法是,在这个特性中可能会有cmake_minimum_required(DATE 2021-11-03)或类似的功能。

这里有字符串连接吗?

不是的。它被显式设置。。

所以我可以使用set_minimum_required(XXX )发送一个名为CMAKE_MINIMUM_REQUIRED_XXX的任意变量到?

不是的。

有些变量需要操作,有些变量是可选的。

CMake 参数解析真的很粗糙,很简单。它基本上是在外壳伪码if $1 == "VERSION" then check_version($2) else error中。如何调用这些字符串实际上取决于您对上下文的解释,在cmake_minimum_required的上下文中,确定VERSION是一个“关键字”。或者是“特殊要求的论据”。或者类似的。

所有函数参数都是字符串,函数将它们与其他字符串进行比较并对其执行逻辑。没有其他变量类型。列表是字符串,列表元素由字符串中的;字符分隔。

cmake_minimum_required的实现在这里:https://gitlab.kitware.com/cmake/cmake/-/blob/master/Source/cmCMakeMinimumRequired.cxx#L29。有趣的是,解析看起来是在一个循环中,所以执行cmake_minimum_required(VERSION VERSION VERSION VERSION 3.11)是一样好的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69412908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档