CMake教程:第一步:一个基本的起点

从哪里开始使用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项目。

帮助资源
编辑文件
  • 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支持的特性。

帮助资源
编辑文件
  • 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的当前值替换这些变量。

虽然我们可以直接在源代码中编辑版本,但使用这个特性是首选的,因为它创建了一个单一的事实来源,避免了重复。

目标

定义并报告项目的版本号。

帮助资源
编辑文件
  • 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答案
相关推荐
阿洵Rain1 分钟前
【C++】内存管理
java·jvm·c++
羑悻的小杀马特1 分钟前
面试题05.08绘制直线问题详解(考察点为位运算符)
c++·算法
aherhuo19 分钟前
Tomcat搭建zrlog
开发语言·python·firefox
极客代码28 分钟前
C语言 getchar 函数完全解析:掌握字符输入的关键
linux·c语言·开发语言·getchar
碧海蓝天202233 分钟前
新版双向链表,添加了at, front, back, insert, emplace等为了兼容std.
数据结构·c++·链表
friklogff40 分钟前
【C#生态园】构建安全可靠的身份验证:六种C# OAuth认证库全面比较
开发语言·c#
WZF-Sang41 分钟前
STL——map和set【map和set的介绍和使用】【multimap和multiset】
开发语言·数据结构·c++·b树·学习·leetcode·visual studio
君莫笑∽GL1 小时前
机器学习(1):机器学习的概念
开发语言·python·机器学习
waves浪游1 小时前
八大排序详解
c语言·开发语言·数据结构·算法·链表·排序算法
2401_858286112 小时前
62.【C语言】浮点数的存储
c语言·开发语言