CMake 从入门到崩溃1 - CMake 简介
CMake 从入门到崩溃1 - CMake 简介
什么是 CMake
CMake 是一种工具,它读入用于描述软件如何构建的脚本,CMake 将评估这些脚本并构建出表达软件项目的内部结构,如果它处理完这些脚本并没有发现错误,CMake 将生成用于实际构建项目的构建文件(可能是脚本或 IDE 工程文件)
CMake 支持多种构建工具,包括一系列命令行构建工具和主流 IDE,运行 cmake --help
可以看到在当前平台下 CMake 所支持的构建工具。CMake 中将这些构建系统称作 generator
🔑 因此 CMake 不是构建系统,而是构建系统生成器,具体的构建工作还是要交给 Make 、Ninja 等构建系统去做
运行 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.txt
和 CMakeCache.txt
生成构建系统文件
在 CMake-GUI 中,该阶段由点击 Generate
触发
CMake 打印消息 Generating done
以表示生成阶段结束
构建阶段
这一阶段由构建系统负责,在这个阶段中将生成项目的目标
简化工作流
CMake 有一个很好的特性,可以简化开发者的工作流
- 构建系统会监视 CMake 文件的变化,并在变化时自动地去重新运行配置阶段
- 命令行模式下,这意味着我们只需要调用一次
cmake ..
,后面只需要简单调用cmake --build
就可以了
本文来自博客园,作者:路过的摸鱼侠,转载请注明原文链接:https://www.cnblogs.com/ljx-null/p/15941115.html