我知道以下CMake声明的含义:
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中尝试使用下面的语句
cmake_minimum_required(XXX 123)cmake抱怨说:
CMake Error at CMakeLists.txt:2 (cmake_minimum_required):
cmake_minimum_required called with unknown argument "XXX".所以这似乎是一场争论。
但是根据这里的project()命令,类似的VERSION字符串被指定为选项。看上去有点矛盾。
加2
我刚刚在CMakeLists.txt中尝试使用下面的语句
cmake_minimum_required(3.10)cmake抱怨说:
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..。
发布于 2021-11-03 08:12:28
我认为CMake命令的输入可以分为3种类型:
... )对于1,类似于VERSION in cmake_minimum_required,它的值紧跟在它后面。它被称为关键字或选项。
对于2,这种参数有一个正式的名称,并通过该名称在命令体中引用。
对于3,可以使用ARGV、ARGN、ARGVC引用该参数。
我还在某个地方看到了marker argument。但我忘了在哪。可怕的语法..。
加1
好的,我找到了marker argument。它在掌握CMake一书中由CMake团队编写:


...while,CMake官方文件说这是一个选项
搜索路径选项或命令的简短版本指定的路径。这些通常是硬编码的猜测。
多么混乱的措辞..。
发布于 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)是一样好的。
https://stackoverflow.com/questions/69412908
复制相似问题