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

4 篇文章 0 订阅
3 篇文章 0 订阅

        从哪里开始使用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答案
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jyl_sh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值