鉴于自己破烂的英语,所以把cmake的官方文档用 谷歌翻译 翻译下来方便查看。
英语好的同学建议直接去看cmake官方文档(英文)学习:地址 点这里
或复制:https://cmake.org/cmake/help/latest/guide/tutorial/index.html
因为官方文档有点多,所以只截取CMake Tutorial的 step1——step12 进行翻译,这是第1步的翻译,以下是每一步的翻译链接:
Documentation » CMake Tutorial » Step 1: A Basic Starting Point
Documentation » CMake Tutorial » Step 2: Adding a Library
Documentation » CMake Tutorial » Step 3: Adding Usage Requirements for a Library
Documentation » CMake Tutorial » Step 4: Adding Generator Expressions
Documentation » CMake Tutorial » Step 5: Installing and Testing
Documentation » CMake Tutorial » Step 6: Adding Support for a Testing Dashboard
Documentation » CMake Tutorial » Step 7: Adding System Introspection
Documentation » CMake Tutorial » Step 8: Adding a Custom Command and Generated File
Documentation » CMake Tutorial » Step 9: Packaging an Installer
Documentation » CMake Tutorial » Step 10: Selecting Static or Shared Libraries
Documentation » CMake Tutorial » Step 11: Adding Export Configuration
Documentation » CMake Tutorial » Step 12: Packaging Debug and Release
谷歌翻译可能有错,此文档的目的仅是加快观看英文官方文档的速度,所以请结合英文官方文档观看
Step 1: A Basic Starting Point
我从哪里开始使用 CMake? 此步骤将介绍 CMake 的一些基本语法、命令和变量。 介绍这些概念后,我们将完成三个练习并创建一个简单的 CMake 项目。
此步骤中的每个练习都将从一些背景信息开始。 然后,提供目标和有用资源列表。 “要编辑的文件”部分中的每个文件都位于 Step1 目录中,并包含一个或多个 TODO 注释。 每个 TODO 代表要更改或添加的一两行代码。 TODO 旨在按数字顺序完成,首先完成 TODO 1,然后完成 TODO 2,依此类推。入门部分将提供一些有用的提示并指导您完成练习。 然后“构建和运行”部分将逐步介绍如何构建和测试练习。 最后,在每个练习结束时讨论预期的解决方案。
另请注意,本教程中的每个步骤都建立在下一个步骤的基础上。 例如,Step2 的起始代码是 Step1 的完整解决方案。
Exercise 1 - Building a Basic Project
最基本的 CMake 项目是从单个源代码文件构建的可执行文件。 对于像这样的简单项目,只需要一个包含三个命令的 CMakeLists.txt 文件即可。
注意:虽然 CMake 支持大写、小写和混合大小写命令,但首选小写命令,并将在整个教程中使用。
任何项目最顶层的 CMakeLists.txt 都必须首先使用 cmake_minimum_required() 命令指定最低 CMake 版本。 这会建立策略设置并确保以下 CMake 函数与兼容版本的 CMake 一起运行。
要启动项目,我们使用project()命令来设置项目名称。 每个项目都需要此调用,并且应在 cmake_minimum_required() 之后立即调用。 正如我们稍后将看到的,该命令还可以用于指定其他项目级别信息,例如语言或版本号。
最后,add_executable() 命令告诉 CMake 使用指定的源代码文件创建可执行文件。
Goal
了解如何创建简单的 CMake 项目。
Helpful Resources
add_executable()
cmake_minimum_required()
project()
Files to Edit
CMakeLists.txt
Getting Started
Help/guide/tutorial/Step1 目录中提供了tutorial.cxx 的源代码,可用于计算数字的平方根。 该文件不需要在此步骤中编辑。
在同一目录中有一个 CMakeLists.txt 文件,您将完成该文件。 从 TODO 1 开始,完成 TODO 3。
Build and Run
一旦 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:
Tutorial 4294967296
Tutorial 10
Tutorial
注意:根据 shell,正确的语法可能是Tutorial、./Tutorial 或.\Tutorial。 为简单起见,练习将始终使用教程。
Solution
如上所述,我们只需要一个三行 CMakeLists.txt 即可启动和运行。 第一行是使用 cmake_minimum_required() 设置 CMake 版本,如下所示:
TODO 1: CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
制作基本项目的下一步是使用project()命令,如下所示设置项目名称:
TODO 2: CMakeLists.txt
project(Tutorial)
调用基本项目的最后一个命令是 add_executable()。 我们这样称呼它:
TODO 3: CMakeLists.txt
add_executable(Tutorial tutorial.cxx)
Exercise 2 - Specifying the C++ Standard
CMake 有一些特殊变量,这些变量要么在幕后创建,要么在由项目代码设置时对 CMake 有意义。 其中许多变量以 CMAKE_ 开头。 为项目创建变量时避免这种命名约定。 其中两个特殊的用户可设置变量是 CMAKE_CXX_STANDARD 和 CMAKE_CXX_STANDARD_REQUIRED。 这些可以一起使用来指定构建项目所需的 C++ 标准。
Goal
添加需要 C++11 的功能。
Helpful Resources
CMAKE_CXX_STANDARD
CMAKE_CXX_STANDARD_REQUIRED
set()
Files to Edit
CMakeLists.txt
tutorial.cxx
Getting Started
继续编辑Step1目录中的文件。 从 TODO 4 开始,到 TODO 6 完成。
首先,编辑tutorial.cxx,添加需要C++11的功能。 然后更新 CMakeLists.txt 以要求 C++11。
Build and Run
让我们再次构建我们的项目。 由于我们已经创建了构建目录并为练习 1 运行了 CMake,因此我们可以跳到构建步骤:
cd Step1_build
cmake --build .
现在我们可以尝试使用新构建的教程以及与以前相同的命令:
Tutorial 4294967296
Tutorial 10
Tutorial
Solution
我们首先通过在tutorial.cxx 中将 atof 替换为 std::stod 来向我们的项目添加一些 C++11 功能。 这看起来像下面这样:
TODO 4: tutorial.cxx
const double inputValue = std::stod(argv[1]);
要完成 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: CMakeLists.txt
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
Exercise 3 - Adding a Version Number and Configured Header File
有时,让 CMakelists.txt 文件中定义的变量在源代码中也可用可能会很有用。 在这种情况下,我们想打印项目版本。
实现此目的的一种方法是使用配置的头文件。 我们创建一个输入文件,其中包含一个或多个要替换的变量。 这些变量具有特殊的语法,类似于@VAR@。 然后,我们使用configure_file()命令将输入文件复制到给定的输出文件,并将这些变量替换为CMakelists.txt文件中VAR的当前值。
虽然我们可以直接在源代码中编辑版本,但首选使用此功能,因为它创建单一事实来源并避免重复。
Goal
定义并报告项目的版本号。
Helpful Resources
<PROJECT-NAME>_VERSION_MAJOR
<PROJECT-NAME>_VERSION_MINOR
configure_file()
target_include_directories()
Files to Edit
CMakeLists.txt
tutorial.cxx
Getting Started
继续编辑步骤 1 中的文件。 从 TODO 7 开始,完成 TODO 12。在本练习中,我们首先在 CMakeLists.txt 中添加项目版本号。 在同一文件中,使用 configure_file() 将给定的输入文件复制到输出文件,并替换输入文件内容中的一些变量值。
接下来,创建一个输入头文件TutorialConfig.h.in 定义版本号,它将接受从configure_file() 传递的变量。
最后,更新tutorial.cxx以打印出其版本号。
Build and Run
让我们再次构建我们的项目。 和之前一样,我们已经创建了一个构建目录并运行了 CMake,因此我们可以跳到构建步骤:
cd Step1_build
cmake --build .
验证在不带任何参数运行可执行文件时是否报告版本号。
Solution
在本练习中,我们通过打印版本号来改进可执行文件。 虽然我们可以专门在源代码中执行此操作,但使用 CMakeLists.txt 让我们可以维护版本号的单一数据源。
首先,我们修改 CMakeLists.txt 文件以使用 project() 命令设置项目名称和版本号。 当调用project()命令时,CMake在幕后定义Tutorial_VERSION_MAJOR和Tutorial_VERSION_MINOR。
TODO 7: CMakeLists.txt
project(Tutorial VERSION 1.0)
然后我们使用configure_file()复制输入文件并替换指定的CMake变量:
TODO 8: CMakeLists.txt
configure_file(TutorialConfig.h.in TutorialConfig.h)
由于配置的文件将写入项目二进制目录,因此我们必须将该目录添加到路径列表中以搜索包含文件。
注意:在本教程中,我们将交替引用项目构建和项目二进制目录。 它们是相同的,并不意味着引用 bin/ 目录。
我们使用 target_include_directories() 来指定可执行目标应在何处查找包含文件。
TODO 9: CMakeLists.txt
target_include_directories(Tutorial PUBLIC
“${PROJECT_BINARY_DIR}”
)
TutorialConfig.h.in 是要配置的输入头文件。 当从 CMakeLists.txt 调用 configure_file() 时,@Tutorial_VERSION_MAJOR@ 和 @Tutorial_VERSION_MINOR@ 的值将替换为 TutorialConfig.h 中项目的相应版本号。
TODO 10: TutorialConfig.h.in
// the configured options and settings for Tutorial
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
接下来,我们需要修改tutorial.cxx以包含配置的头文件TutorialConfig.h。
TODO 11: tutorial.cxx
#include “TutorialConfig.h”
最后,我们通过更新tutorial.cxx打印出可执行文件名称和版本号,如下所示:
TODO 12 : tutorial.cxx
if (argc < 2) {
// report version
std::cout << argv[0] << " Version " << Tutorial_VERSION_MAJOR << “.”
<< Tutorial_VERSION_MINOR << std::endl;
std::cout << “Usage: " << argv[0] << " number” << std::endl;
return 1;
}