CMake官方教程使用说明及重点总结(上)

479 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第28天,点击查看活动详情。 写文章不易,阅读之前请给我点个赞吧~

官方教程使用说明及总结

一、教程预览

首先大家可以从官方教程的页面上获取源码 接着我们总结下官方都给我们举了哪些示例,大家可以根据需求去学习。

我们将通过上中下讲述这个部分的内容

上主要讲述:

  • 步骤1:一个基本的起点
    • 练习1 -建立一个基本项目
    • 练习2 -指定c++标准
    • 练习3 -添加版本号和配置的头文件

中主要讲述:

  • 步骤2:添加库
    • 练习1 -创建库
    • 练习2 -使我们的库可选
  • 步骤3:添加库使用要求
    • 练习1 -添加库的使用要求
  • 步骤4:添加生成器表达式
    • 练习1 -使用接口库设置c++标准
    • 练习2 -用生成器表达式添加编译器警告标志
  • 步骤5:安装和测试
    • 练习1 -安装规则
    • 练习2 -测试支持

下主要讲述:

  • 步骤6:添加对测试仪表板的支持
  • 步骤7:添加系统自检
  • 步骤8:添加自定义命令和生成文件
  • 步骤9:打包安装程序
  • 步骤10:选择静态库或共享库
  • 步骤11:添加导出配置
  • 步骤12:打包、调试和发布

二、实战串讲

下面我们将结合源码(源码的内容将不会展示)讲解每个小节的重点内容

image.png

步骤1:一个基本的起点

这里使用的编辑器是前面讲过的Visual Studio Code(windows版)Visual Studio Code(macos 版)进行相关构建操作,之所以使用它是因为它使用快捷键 ctrl/command + j,就可以调用出友好的命令行终端。下面打开第一个项目:Step1 。

练习1 -建立一个基本项目:求平方根

我们可以用官方的模板进行填充

# TODO 1: Set the minimum required version of CMake to be 3.10

# TODO 2: Create a project named Tutorial

# TODO 7: Set the project version number as 1.0 in the above project command

# TODO 6: Set the variable CMAKE_CXX_STANDARD to 11
#         and the variable CMAKE_CXX_STANDARD_REQUIRED to True

# TODO 8: Use configure_file to configure and copy TutorialConfig.h.in to
#         TutorialConfig.h

# TODO 3: Add an executable called Tutorial to the project
# Hint: Be sure to specify the source file as tutorial.cxx

# TODO 9: Use target_include_directories to include ${PROJECT_BINARY_DIR}

更多细节可以看初识CMake之使用 CMakeLists.txt 编译单文件 C++ 源码,对于一个最简单的 CMake 程序包括以下三个部分就可以跑起来了。

image.png

之后按照官方教程进行平方根的测试:

image.png

练习2 -指定c++标准

当使用一些C++11特性的语法的时候,需要增加

image.png

练习3 -添加版本号和配置的头文件

我们希望 CMakelists.txt 文件中定义的变量也可以在源代码中使用。

实现这一点的一种方法是使用配置好的头文件。我们创建一个输入文件,其中包含一个或多个要替换的变量。这些变量具有类似 @VAR@ 的特殊语法。然后,我们使用configure_file() 命令将输入文件复制到给定的输出文件,并用 CMakeLists.txt 文件中的 VAR 当前值替换这些变量。

比如这里的例子,想打印项目版本。 当 project() 命令被调用时,CMake 在幕后定义Tutorial_VERSION_MAJORTutorial_VERSION_MINOR

project(Tutorial VERSION 1.0)

在定义版本号时创建一个输入头文件 TutorialConfig.h.in , 它将接受configure_file() 传递的变量。首先我们在 TutorialConfig.h.in 中增加下面的代码

// the configured options and settings for Tutorial
// TODO 10: Define Tutorial_VERSION_MAJOR and Tutorial_VERSION_MINOR
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@

使用 configure_file() 去复制被替换了指定的CMake变量的输入文件

configure_file(TutorialConfig.h.in TutorialConfig.h)

由于配置的文件将被写入项目二进制目录,我们必须将该目录添加到搜索包含文件的路径列表中。

我们使用 target_include_directories() 来指定可执行目标应该在哪里查找包含文件。

target_include_directories(Tutorial PUBLIC
                           "${PROJECT_BINARY_DIR}"
                           )

TutorialConfig.h.in 是要配置的输入头文件。当 configure_file()从我们的 CMakeLists.txt 中被调用时,@Tutorial_VERSION_MAJOR@@Tutorial_VERSION_MINOR@ 的值将被替换为来自 TutorialConfig.h 项目中的相应版本号 。

在主函数中,在参数小于两个的情况添加打印 CMake 中的版本号

可以看到在构建目录 step1_build 中生成了 TutorialConfig.h

image.png

同时调用参数小于2个的时候,还会看到对应的版本信息

image.png

总结

总结一下这部分的内容就是通过配置一些后缀为 .h.in 的配置文件,作为中间载体,使用 @VAR@ 的变量, 读取CMakeLists.txt 中的一些变化的量,(比如这里project() 命令被调用时,CMake 就默默定义了定义 Tutorial_VERSION_MAJORTutorial_VERSION_MINOR 的值,configure_file 的时候就把连 .h.in 中的内容连同对应的值一起复制到对应的 .h 文件中),进而传到源码中,供源码使用。

所以这个部分对于我们的源码想要使用一些编译过程中变化的量,比如版本号,是十分有帮助的。