从哪里开始使用CMake?这一步将介绍一些CMake的基本语法、命令和变量。随着这些概念的介绍,我们将通过三个练习并创建一个简单的CMake项目。
本步骤中的每个练习都将从一些背景信息开始。然后,提供一个目标和有用的资源列表。“要编辑的文件”部分中的每个文件都位于Step1目录中,并包含一个或多个TODO注释。每个TODO表示要更改或添加的一两行代码。TODO是按数字顺序完成的,首先完成TODO 1,然后完成TODO 2,依此类推。入门部分将提供一些有用的提示并指导您完成练习。然后,构建和运行部分将逐步介绍如何构建和测试练习。最后,在每个练习结束时讨论预期的解决方案。
还要注意,本教程中的每一步都建立在下一步的基础上。因此,例如,步骤2的起始代码是步骤1的完整解。
练习1 -建立一个基本项目
最基本的CMake项目是从单个源代码文件构建的可执行文件。对于这样的简单项目,只需要一个包含三个命令的CMakeLists.txt文件。
注意:虽然CMake支持大写,小写和混合大小写命令,但小写命令是首选,并将在整个教程中使用。
任何项目的最重要的CMakeLists.txt必须从使用cmake_minimum_required()命令指定最小CMake版本开始。这将建立策略设置,并确保以下CMake函数与CMake的兼容版本一起运行。
要启动一个项目,我们使用project()命令来设置项目名称。这个调用对于每个项目都是必需的,应该在cmake_minimum_required()之后不久调用。正如我们稍后将看到的,该命令还可以用于指定其他项目级别的信息,如语言或版本号。
最后,add_executable()命令告诉CMake使用指定的源代码文件创建一个可执行文件。
目标
了解如何创建一个简单的CMake项目。
帮助资源
-
add_executable()
-
cmake_minimum_required()
-
project()
编辑文件
-
CMakeLists.txt
开始
本教程的源代码。cxx在Help/guide/tutorial/Step1目录中提供,可用于计算数字的平方根。此步骤不需要编辑此文件。
在同一目录下是一个CMakeLists.txt文件,您将完成该文件。从待办事项TODO 1开始,逐步完成待办事项TODO 3。
构建并运行
一旦完成了TODO 1到TODO 3,我们就准备好构建和运行我们的项目了!首先,运行cmake可执行文件或cmake-gui来配置项目,然后使用您选择的构建工具构建它。
例如,我们可以从命令行导航到CMake源代码树的Help/guide/tutorial目录,并创建一个构建目录:
mkdir Step1_build
接下来,导航到该构建目录并运行cmake来配置项目并生成一个本地构建系统:
cd Step1_build cmake ../Step1
然后调用构建系统来编译/链接项目:
cmake --build .
对于多配置生成器(例如Visual Studio),首先导航到适当的子目录,例如:
cd Debug
最后,尝试使用新建的教程:
Tutorial 4294967296 Tutorial 10 Tutorial
注意:根据shell的不同,正确的语法可能是Tutorial、。/Tutorial或。\Tutorial。为简单起见,练习将自始至终使用Tutorial。
解决方案
如上所述,三行CMakeLists.txt是我们启动和运行所需的全部内容。第一行使用cmake_minimum_required()设置CMake版本,如下所示:
- 待办事项TODO 1:单击显示/隐藏答案
- 下一步创建基本工程,使用project()命令设置工程名称,如下所示:
- 待办事项TODO 2:单击显示/隐藏答案
- 为基本项目调用的最后一个命令是add_executable()。我们称之为:
- 待办事项TODO 3:单击显示/隐藏答案
练习2 -指定c++标准
CMake有一些特殊的变量,这些变量要么是在幕后创建的,要么是在项目代码中设置的。这些变量中有许多以CMAKE_开头。在为项目创建变量时避免这种命名约定。其中两个特殊的用户可设置变量是CMAKE_CXX_STANDARD和CMAKE_CXX_STANDARD_REQUIRED。它们可以一起用于指定构建项目所需的c++标准。
目标
添加一个需要c++ 11支持的特性。
帮助资源
-
CMAKE_CXX_STANDARD
-
CMAKE_CXX_STANDARD_REQUIRED
-
set()
编辑文件
-
CMakeLists.txt
-
tutorial.cxx
开始
继续编辑Step1目录中的文件。从TODO 4开始,完成TODO 6。
首先,编辑教程。通过添加一个需要c++ 11的特性。然后更新CMakeLists.txt以要求c++ 11。
构建并运行
让我们重新构建我们的项目。因为我们已经为练习1创建了一个构建目录并运行了CMake,我们可以跳到构建步骤:
cd Step1_build cmake --build .
现在我们可以尝试使用与之前相同的命令使用新构建的教程:
Tutorial 4294967296 Tutorial 10 Tutorial
解决方案
我们首先通过在tutorial.cxx中将atof替换为std::stod来为我们的项目添加一些c++ 11特性。它看起来像下面这样:
- 待办事项TODO4:单击显示/隐藏答案
要完成待办事项TODO 5,只需删除#include <cstdlib>。
我们需要在CMake代码中明确声明它应该使用正确的标志。在CMake中启用对特定c++标准的支持的一种方法是使用CMAKE_CXX_STANDARD变量。在本教程中,将CMakeLists.txt文件中的CMAKE_CXX_STANDARD变量设置为11,将CMAKE_CXX_STANDARD_REQUIRED设置为True。确保在add_executable()调用的上方添加CMAKE_CXX_STANDARD声明。
- 待办事项TODO 6:单击显示/隐藏 show/hide答案
练习3 -添加版本号和配置的头文件
有时,让CMakelists.txt文件中定义的变量在源代码中也可用可能是有用的。在这种情况下,我们希望打印项目版本。
实现这一目标的一种方法是使用配置好的头文件。我们创建一个输入文件,其中包含一个或多个要替换的变量。这些变量具有类似于@VAR@.的特殊语法然后,我们使用configure_file()命令将输入文件复制到给定的输出文件中,并用CMakelists.txt文件中VAR的当前值替换这些变量。
虽然我们可以直接在源代码中编辑版本,但使用这个特性是首选的,因为它创建了一个单一的事实来源,避免了重复。
目标
定义并报告项目的版本号。
帮助资源
-
<PROJECT-NAME>_VERSION_MAJOR
-
<PROJECT-NAME>_VERSION_MINOR
-
configure_file()
-
target_include_directories()
编辑文件
-
CMakeLists.txt
-
tutorial.cxx
开始
继续从步骤1编辑文件。从TODO 7开始,完成TODO 12。在这个练习中,我们首先在CMakeLists.txt中添加一个项目版本号。在同一个文件中,使用configure_file()将给定的输入文件复制到输出文件中,并在输入文件内容中替换一些变量值。
接下来,在定义版本号时创建一个输入头文件tutorialconfig .h.,它将接受从configure_file()传递的变量。
最后,更新教程。打印出它的版本号。
构建并运行
让我们重新构建我们的项目。和之前一样,我们已经创建了一个构建目录并运行CMake,这样我们就可以跳转到构建步骤:
cd Step1_build cmake --build
验证在不带任何参数运行可执行文件时是否报告了版本号。
解决方案
在本练习中,我们通过打印版本号来改进可执行文件。虽然我们可以只在源代码中这样做,但使用CMakeLists.txt可以让我们维护版本号的单一数据源。
首先,我们修改CMakeLists.txt文件,使用project()命令设置项目名称和版本号。当project()命令被调用时,CMake在幕后定义Tutorial_VERSION_MAJOR和Tutorial_VERSION_MINOR。
- 待办事项TODO 7:点击显示/隐藏show/hide答案
然后我们使用configure_file()复制输入文件,替换指定的CMake变量:
- 待办事项TODO 8:点击显示/隐藏show/hide答案
由于配置的文件将被写入项目二进制目录,我们必须将该目录添加到搜索包含文件的路径列表中。
注意:在本教程中,我们将交替使用项目构建和项目二进制目录。它们是相同的,并不意味着引用bin/目录。
我们使用target_include_directories()来指定可执行目标应该在哪里查找包含文件。
- 待办事项TODO 9:单击显示/隐藏show/hide答案
.in是要配置的输入头文件。当configure_file()从CMakeLists.txt调用时,@Tutorial_VERSION_MAJOR@和@Tutorial_VERSION_MINOR@的值将被tutorial_config .h中项目的相应版本号所替换。
- 待办事项TODO 10:点击显示/隐藏show/hide答案
接下来,我们需要修改教程。包含已配置的头文件TutorialConfig.h。
- 待办事项TODO 11:单击显示/隐藏show/hide答案
最后,我们通过更新教程打印出可执行文件名和版本号。CXX如下:
- 待办事项TODO 12:点击显示/隐藏show/hide答案