持续创作,加速成长!这是我参与「掘金日新计划 · 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:打包、调试和发布
二、实战串讲
下面我们将结合源码(源码的内容将不会展示)讲解每个小节的重点内容
步骤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 程序包括以下三个部分就可以跑起来了。
之后按照官方教程进行平方根的测试:
练习2 -指定c++标准
当使用一些C++11特性的语法的时候,需要增加
练习3 -添加版本号和配置的头文件
我们希望 CMakelists.txt 文件中定义的变量也可以在源代码中使用。
实现这一点的一种方法是使用配置好的头文件。我们创建一个输入文件,其中包含一个或多个要替换的变量。这些变量具有类似 @VAR@ 的特殊语法。然后,我们使用configure_file() 命令将输入文件复制到给定的输出文件,并用 CMakeLists.txt 文件中的 VAR 当前值替换这些变量。
比如这里的例子,想打印项目版本。 当 project() 命令被调用时,CMake 在幕后定义Tutorial_VERSION_MAJOR 和 Tutorial_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
同时调用参数小于2个的时候,还会看到对应的版本信息
总结
总结一下这部分的内容就是通过配置一些后缀为 .h.in 的配置文件,作为中间载体,使用 @VAR@ 的变量, 读取CMakeLists.txt 中的一些变化的量,(比如这里project() 命令被调用时,CMake 就默默定义了定义 Tutorial_VERSION_MAJOR 和 Tutorial_VERSION_MINOR 的值,configure_file 的时候就把连 .h.in 中的内容连同对应的值一起复制到对应的 .h 文件中),进而传到源码中,供源码使用。
所以这个部分对于我们的源码想要使用一些编译过程中变化的量,比如版本号,是十分有帮助的。