运行 CMake 时有两个阶段,如 CMake GUI 中的两个按钮所反映的那样。第一阶段是读入文件的配置步骤CMakeLists.txt
。CMake 在此阶段构建项目的内部表示。之后,称为生成的第二阶段发生在项目文件基于该内部表示写出的地方。
在 CMake GUI 中,这两个阶段可以单独运行。当您运行配置步骤时,GUI 会显示所有缓存变量(见下文),这些变量自上次运行配置或自启动 CMake GUI(如果这是第一次配置运行)以来更改了它们的值。通常的做法是重新运行配置阶段,直到没有变量以红色突出显示。一旦配置没有留下红色的变量,您可以按下生成按钮,构建工具的本机项目文件将被创建,您可以开始构建等。
命令行cmake
工具不允许您单独运行配置和生成步骤。相反,它总是运行配置然后生成。
对于简单的项目,配置和生成之间的区别并不是那么重要。简单的教程通常会将两者混为一谈,因为读者可以在不了解基本项目安排的区别的情况下逃脱。但是,有一些 CMake 特性依赖于这种区别。特别是,生成器表达式是一个生成时间特性,其中关于构建某些方面的决策被延迟到生成时间,而不是在配置时间完全处理。其中一个示例是特定于配置的内容,例如编译器标志、仅为某些配置编译的源文件等。在 CMake 的配置步骤中并不总是知道构建配置(例如 Xcode 和 Visual Studio 是多配置构建工具,所以可以有多个,并且由用户在构建时选择)。生成步骤将为每种构建类型处理生成器表达式,并且每种配置的结果可能不同。您可能还会找到这个答案有关此特定示例的信息。有关利用配置和生成阶段之间区别的技术的更高级示例,请参阅这篇文章,但请注意它不是一种常用技术。
关于缓存是什么的其他问题,CMake 在变量缓存中记录运行之间的信息。在运行结束时,它会更新CMakeCache.txt
构建目录中调用的文件。当您下次运行 CMake 时,它会读取该缓存以预填充各种内容,因此不必重新计算它们(例如查找库和其他包),因此您不必提供要覆盖的自定义选项每一次。您通常不会CMakeCache.txt
手动编辑(尽管这样做是可以的)。相反,您可以在 CMake GUI 中修改所需的变量,然后重新运行配置步骤(不要忘记然后运行 generate 以创建更新的项目文件)。您还可以使用-D
选项在 cmake 命令行中定义或修改缓存变量。