为什么在GUI中有两个按钮“配置”和“生成”,而CLI只需要一个命令就能完成所有操作。

10 浏览
0 Comments

为什么在GUI中有两个按钮“配置”和“生成”,而CLI只需要一个命令就能完成所有操作。

我了解cmake是构建生成器。这意味着它可以根据CMakeLists.txt文件中的指令生成相应的构建(makefiles、Visual Studio项目等)。但有两件事我不太明白,我猜它们是相关的:

  1. 为什么cmake-gui中有两个按钮"Configure"和"Generate"?在我阅读的命令行教程中(例如这个),通常的过程是使用一个cmake命令完成的。
  2. 在cmake的世界里,缓存是什么?据我所知,它是指在按下"Configure"按钮但未按下"Generate"按钮时的状态。但这有什么用?按下"Configure"后弹出的那些变量都是什么意思?我为什么要编辑它们?难道唯一允许的配置不是通过CMakeLists.txt完成吗?

谢谢

0
0 Comments

为什么GUI中有两个按钮Configure和Generate,而CLI可以一条命令完成所有操作?

CMake运行时有两个阶段,这也反映在CMake GUI中的两个按钮上。第一个阶段是配置步骤(configure),在这个阶段,会读取CMakeLists.txt文件。CMake会在这个阶段建立起一个项目的内部表示。然后,第二个阶段称为生成步骤(generate),在这个阶段,会根据内部表示编写项目文件。

在CMake GUI中,这两个阶段可以分开运行。当你运行配置步骤时,GUI会显示所有已更改值的缓存变量(见下文)。通常的做法是,反复运行配置步骤,直到没有变量被标记为红色。一旦配置不再有红色变量,你就可以点击生成按钮,生成构建工具的本地项目文件,然后就可以开始构建等操作了。

命令行工具cmake不允许将配置和生成步骤分开运行,它总是先运行配置,然后再运行生成。

对于简单的项目,配置和生成之间的区别并不是很重要。简单的教程通常会将两者合并在一起,因为读者可以在基本项目安排中不用理解区别。然而,有些CMake功能依赖于这种区别。特别是生成时特定的内容,例如编译器标志、仅为某些配置编译的源文件等。构建配置并不总是在CMake的配置阶段知道(例如Xcode和Visual Studio是多配置构建工具,所以可能有多个配置,用户在构建时选择)。生成阶段将为每个构建类型处理生成表达式,并且结果对于每个配置可能是不同的。你还可以在这个答案中找到有关这个特定示例的信息。有关利用配置和生成阶段区别的更高级示例,请参考这篇帖子,但请注意,这不是常见的技术。

关于你提到的关于缓存的问题,CMake在变量缓存中记录运行之间的信息。在运行结束时,它会更新构建目录中的一个名为CMakeCache.txt的文件。下次运行CMake时,它会读取缓存以预填充各种内容,这样就不需要重新计算它们(例如查找库和其他包),也不需要每次都提供自定义选项。通常情况下,你不会手动编辑CMakeCache.txt(尽管这样做也可以)。相反,你可以在CMake GUI中修改所需的变量,然后重新运行配置步骤(不要忘记同时运行生成,以创建更新的项目文件)。你还可以使用-D选项在cmake命令行中定义或修改缓存变量。

非常感谢您的回复。能否提供一个实际的示例(真正的hello world项目),让我们看到"Configure"和"Generate"是如何操作的,也许"红色"变量在构建过程中会导致错误,您是否了解任何相关信息?谢谢。

红色变量并不代表错误,只是自上次运行以来发生了更改。可能需要多次运行配置步骤的一个具体情况是,当某个选项只有在启用某个其他选项后才会添加时。这是不寻常的,但完全有效的。任何使用生成器表达式的项目都是配置和生成很重要的实际示例。建议您阅读CMake文档获取更多信息。

0