官方文档:https://cmake.org/cmake/help/latest/index.html
命令行工具
cmake | 生成编译系统 编译和链接 本地安装 help 脚本模式 命令行模式 |
| ctest | 集成测试 |
| cpack | 打包 |
生成构建框架

这是生成构建系统的三种方式,接下来一个一个演示。
这是目录结构。下面是演示效果。(都是在构建目录中演示的。)

-------------------------------------------------------------------------------------------------------------------
为什么cmake ..就能生成构建系统呢?
在上层去寻找CMakeLists.txt文件。就是因为cmake ..,为什么cmake . 就能生成构建体系呢?
以为在cmake ..,生成构建环境之后,在构建目录下会生成一个CMakeCache.txt文件,在文件中有一个CMAKE_HOME_DIRECTORY的字段,帮助指引寻找到顶级CMakeLists.txt文件所在的位置,原理和cmake ..一样,都得寻找CMakeLists.txt文件
编译链接
cmake --build <dir>(这里的dir就是构建目录) 等价于 make
在生成构建目录之后,就会直接生成Makefile文件,使用make就能达成编译。
为什么cmake --build <dir>就等价于make呢?

因为在构建目录的CMakeCache.txt资料中配置了语句的,使用cmake --build <dir>,实际上是使用的gmake。而这里的gmake实际上是make的一个软链接。所以二者效果等效。
![]()
实际效果如下:

测试
ctest [options]和make test等价
为什么make test和ctest等价呢?

在构建目录下生成的Makefile文件中,也做了配备,应用make test的时候,实际上调用的还是ctest命令完成的。
实际效果如下:

接下来解释效果

为什么采用ctest命令,就知道去测试test_add呢?
核心在于构建目录下生成了CTestTestfile.cmake脚本,在该脚本中对于顶级CMakeLists.txt中集成ctest的配置进行了翻译。
![]()
在顶级CMakeLists.txt集成ctest,开始添加生成二进制可执行程序,在开启测试测试能力,使用CTest中的add_test模块,添加测试case。

安装
在单元测试通过之后,我们可以使⽤cmake的安装命令把库和⼆进制发布到本机的标准路径,供⼤家⼀起开发使⽤。如果cmake的配置⽂件CMakeLists.txt⾥包含install函数,则⽣成的makefile⾥也会包含install 伪⽬标,可以使⽤make来执⾏。
cmake --install <dir>(这里的dir是构建目录)命令等价于make install

这里等价的原因,也是因为在Makefile资料中做了配置。二者实际上都是在实际执行cmake_install.cmake脚本文档。如果单独执行这个cmake脚本也是有一样的效果。

效果如下:

一个临时目录,可以任意删除就是安装之前:main是在自己项目的构建目录下,
安装之后:main是在机器的公共目录下 /usr/local/bin/main,删除的话,就需要权限管理了
安装之后,还会生成一个资源清单

打包
可以使⽤cpack 把⼆进制或者动态库打包成压缩包的⽅式进⾏分发和共享。假设cmake的配置⽂件CMakeLists.txt⾥包括CPack功能,则⽣成的makefile⾥也会包含 package 伪⽬标,可以使⽤make 来执⾏。
cpack [options] 等价于 make package
二者实际上都是执行CPackConfig.cmake脚本,里面配置了生成的包的格式、名称、版本等

cpack的执行步骤:
1、设置临时安装目录
2、执行cmake_install.cmake
3、收集临时目录的文件列表
4、执行打包 &拷贝压缩包至构建目录
make install 执行cmake_install.cmake的目的地是/usr/local
cpack执行cmake_install.cmake的目的地是临时的安装目录。
所以这里会存在权限的不同。
脚本模式
cmake脚本模式,不会生成构建产物,也不会生成中间过程。
以cmake为后缀的脚本文件)就是cmake -P <file>(这里的file就
比如 /usr/local/bin/cmake -P cmake_install.cmake
调用外部命令
调用外部命令,类似于shell命令行一样。可以理解为使用cmake -E执行shell命令行
cmake -E [options]

查看帮助
查看帮助文档 cmake --help
重点命令解释
cmake_minimum_required
指定项目所需的最低 CMake 版本,应放在顶级 CMakeLists.txt 的第⼀⾏。

project
给项目设置一个名称。指定项⽬名字,放在顶级CMakeLists⽂件的第⼆⾏,⼦⽬录中⼀般⽆需调⽤。
project(<PROJECT-NAME> [<language-name>...])project(<PROJECT-NAME>[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]][DESCRIPTION <project-description-string>][HOMEPAGE_URL <url-string>][LANGUAGES <language-name>...])

project()执行后,CMake会自动创建一些变量,比如PROJECT_VERSION
如果没有设置语言,cmake默认设置C/C++。若是语言设置错了,就会报错 cmake error。
cmake提供的打印函数。可以打印一些变量值就是message函数

运行

include
加载指定的脚本文件或者模块到当前CMakeLists.txt执行的上下文中并运行。类似于C语言中的include
文件的搜索路径
若是指定的是相对路径,则相对当前的正在执⾏的CMakeLists.txt 所在的⽬录。
绝对路径,那直接从对应的磁盘⽂件读取⽂件并加载执⾏。就是假如指定的
module搜索路径顺序
首先在当前⽬录查找指定⽂件。
然后在CMAKE_MODULE_PATH变量指定的⽬录中查找。
执行逻辑
在当前执⾏上下⽂执⾏被包含的camke代码。
这是目录结构。

在CMakeLists.txt中编辑如下。

在sub文件夹中的sub.cmake中编辑如下

运行效果
许可观察出,当要真实获取当前正在执行的cmake脚本的路径时,运用CMAKE_CURRENT_LIST_DIR变量。
install
安装(可以理解为cp) 将 ⼆进制,静态库,动态库,头⽂件,安装⽂件 部署到指定⽬录。
在构建目录下会生成cmake_install.cmake脚本,其中通过cmake内置的api file调用底层操作系统完毕真正的文件处理。
总的来说install分为3个阶段,1、收集安装对应的,比如目标、文件和code等2、生成cmake_install.cmake脚本3、cmake执行cmake_install.cmake脚本,采用file()内置API进行文件操作。
| 参数 | 含义 |
TARGETS | 安装 使⽤add_executable和add_library 构建的⽬标⽂件。 |
FILES | 安装 ⽂件 |
DIRECTORY | 安装整个⽬录 |
EXPORT | 安装导出⽬录,⽤于发布⾃⼰的脚本,供别⼈使⽤。 |
DESTINATION | 指定安装路径,路径可以是绝对路径,也可能是相对路径(相对于 CMAKE_INSTALL_PREFIX )。 |

执行

add_executable
指定cmake 从源代码⽣成⼀个可执⾏⽂件。
| 参数 | 含义 |
target_name | 可执⾏⽂件的名称(不含有扩展名,如 myapp),项⽬内部唯⼀ |
<sources> | 源⽂件列表(如 src/main.cpp) |
可执行文件在构建目录下的位置,与在源代码目录中的位置是对应的。