CMake 从入门到崩溃1 - CMake 简介

CMake 从入门到崩溃1 - CMake 简介

什么是 CMake

CMake 是一种工具,它读入用于描述软件如何构建的脚本,CMake 将评估这些脚本并构建出表达软件项目的内部结构,如果它处理完这些脚本并没有发现错误,CMake 将生成用于实际构建项目的构建文件(可能是脚本或 IDE 工程文件)

CMake 支持多种构建工具,包括一系列命令行构建工具和主流 IDE,运行 cmake --help 可以看到在当前平台下 CMake 所支持的构建工具。CMake 中将这些构建系统称作 generator

🔑 因此 CMake 不是构建系统,而是构建系统生成器,具体的构建工作还是要交给 MakeNinja 等构建系统去做

运行 CMake 时,它会运行多项检查,在检查和评估构建脚本期间,它会将一些值缓存到 CMakeCache.txt 当中,这让我们在增量式开发中,可以跳过长时间的检查过程,但 CMake 的缓存行为也会带来一些问题,比如你修改了某些配置没法及时的反映在下次构建中,所有有时候构建出现问题可以尝试删除 CMake 缓存文件后重新构建

什么是 CMakeLists.txt?

放置所有 CMake 命令的文件,当 cmake 在某个文件夹下运行时,会寻找该文件,如果找不到则报错

为什么要使用 CMake

  • 跨平台
  • 可配置
  • 众多开源项目都(仅)支持CMake构建

构建CMake项目

CMake构建的两种形式:

  • 就地构建
  • 源码外构建

CMake 支持两种构建形式:就地(in-source)构建和源码外(out-of-source)构建

就地构建

在源文件目录下构建,产生的二进制文件将与源文件生成在一个文件夹里。想要执行就地构建,只需要在源码文件夹运行命令 cmake .,和之前说过的一样,cmake 只是生成了构建工具需要的文件,具体的目标构建还需要构建工具来做,因此还需要运行 cmake --build 执行构建

源码外构建

单独创建一个 build 文件夹,在该文件夹下构建二进制文件,与源代码文件分开。执行源码外构建,需要运行命令

mkdir build; cd ./build
cmake ..
cmake --build

🔑 推荐使用源码外构建,可以在不同目录下用不同的选项去构建项目,比如 Debug 和 Release 分支;此外如果我们使用 git 之类的项目管理工具,那么只需要在. gitignore 下加上我们的构建目录即可让 git 不要管理我们的构建目录

源码树和构建树

在 CMake 文档中我们经常会看到 source tree 和 build tree 的说法,事实上源码树就是你的源码目录,里面放置着你的源码文件和 CMakeLists.txt 文件,构建树就是放置你构建系统文件和输出文件的目录

我们可以通过变量 CMAKE_BINARY_DIR 访问到构建树的顶层文件夹(执行cmake命令的目录),通过变量 CMAKE_SOURCE_DIR 访问到源码树的顶层文件夹(根CMakeLists.txt文件所在的目录)。对于就地构建,两者是等价的

CMake阶段

CMake 的执行过程分三个阶段

配置阶段

在这一阶段,CMake 将解析源码树顶层的 CMakeLists.txt,并生成一个 CMakeCache.txt 以存储 cache 变量

对于 CMake-GUI,该阶段由点击 Configure 触发,对于命令行版本的 CMake,该阶段与生成阶段结合在一起

CMake 打印消息 Configuring done 以表示配置阶段结束

生成阶段

在这一阶段,CMake 将根据 CMakeLists.txtCMakeCache.txt 生成构建系统文件

在 CMake-GUI 中,该阶段由点击 Generate 触发

CMake 打印消息 Generating done 以表示生成阶段结束

构建阶段

这一阶段由构建系统负责,在这个阶段中将生成项目的目标

简化工作流

CMake 有一个很好的特性,可以简化开发者的工作流

  • 构建系统会监视 CMake 文件的变化,并在变化时自动地去重新运行配置阶段
  • 命令行模式下,这意味着我们只需要调用一次 cmake ..,后面只需要简单调用 cmake --build 就可以了

posted @ 2022-02-26 23:33  路过的摸鱼侠  阅读(457)  评论(0编辑  收藏  举报