【软件开发】CMake 学习笔记
本文最后更新于 2025年12月23日 晚上
【软件开发】CMake 学习笔记
CMake 是什么?
是构建系统(如 Visual Studio)的文件(如 .vcxproj .sln)的创建器,具体要生成的构建系统可以通过 CMakePresets 文件中的 generator 指定。
构建系统一般不是跨平台的,但 CMake 支持在不同的操作系统上生成不同的构建系统文件,通过这种包装的方式从而实现了 C++项目的跨平台。

CMake 指令
https://cmake.org/cmake/help/latest/manual/cmake.1.html
1 | |
CMakeLists 指令
CMakeLists.txt是生成 CMake 项目的说明文件,用专门的 CMake 语言编写,由于 CMake 也是一种编程语言,因此也支持判断循环等,此外还提供了很多便利的功能性指令。
CMakeLists.txt可以有多份,但每个文件夹至多能放一个,此外顶层CMakeLists.txt文件中的首条指令必须用于指定 CMake 版本,版本指令如下:
1 | |
环境变量
CMake 中没有常规编程语言中的变量概念,所有中间数据都用环境变量存储。环境变量即一对字符串键值组,恰好充当变量名和变量值。用户可以自己设置环境变量,也可以获取系统的环境变量。
基本读写
1 | |
编辑内容
环境变量本质就是字符串,可以采用 string、list、包括再次使用 set 等命令来编辑。另外针对非局部作用域变量的编辑还有几个注意点:
- 对缓存变量和父作用域变量编辑,只会修改以其为初值的局部变量,因此修改完必须再次显式设置为缓存变量。
- 缓存变量可以在构建 cmake 文件时从命令行设置
-D<var>=<value>,注意代码中也要set该缓存命令才行,但不要用FORCE关键字。
预设环境变量
CMake 系统预设的环境变量,用户可以从中读写一些重要的配置数据。
-
编译环境
CMAKE_CXX_STANDARD:项目中所用的 C++标准(数字,如 17、20)CMAKE_CXX_STANDARD_REQUIRED:指定的 C++标准是否是必须的,从而决定编译器不支持时是否停止生成(布尔值)
-
项目信息
<projectName>_VERSION_MAJOR:声明项目时额外提供的主版本号。<projectName>_VERSION_MINOR:声明项目时额外提供的次版本号。
-
目录
CMAKE_SOURCE_DIR:顶级 CMakeLists 的源目录。CMAKE_BINARY_DIR:顶级 CMakeLists 的构建目录。CMAKE_CURRENT_SOURCE_DIR:当前 CMakeLists 的源目录。CMAKE_CURRENT_BINARY_DIR:当前 CMakeLists 的构建目录。PROJECT_BINARY_DIR:上次调用project()的 CMakeLists 对应的构建目录。PROJECT_SOURCE_DIR:上次调用project()的 CMakeLists 对应的源目录。CMAKE_RUNTIME_OUTPUT_DIRECTORY:构建系统最终输出的二进制文件的目录。
备注:指令 5、6 不受
add_subdirectory()影响。
环境变量列表
CMake 中没有常规编程语言中数组的概念,相应的是改用“环境变量列表”代替。环境变量列表本质也是一个环境变量,其值也是一个字符串,但特别的是该值通常是由多个用“;”分隔的条目组成。
许多指令都支持环境变量列表作为输入来支持多参数,同时也配有专门的工具指令来编辑环境变量列表。
1 | |
流程控制
既然是编程语言,自然也支持逻辑控制。
条件执行
1 | |
遍历执行
1 | |
函数定义
既然是编程语言,自然也支持自定义函数。
1 | |
依赖处理
由于CMakeLists.txt可以有多份,甚至打包成模块,因此需要相关的指令处理依赖。
1 | |
项目配置
CMakeLists.txt主要用于创建 C++项目,必然需要很多声明项目属性的指令。每个CMakeLists.txt文件中只能声明一个项目,当有多个项目时需要创建多份CMakeLists.txt。
基础配置
以下指令是创建一个项目必须要提供的。
1 | |
可选配置
可选的影响项目属性的配置
1 | |
-
依赖项传递说明:
PUBLIC:使用该选项添加引用,引用的头文件将传染给使用该项目的其他项目。PRIVATE:引用不具备传染性,其他使用该项目的项目可能要再次添加头文件引用。
除非项目已经将引用的库完全封装,希望后续的使用者不要再直接调用该引用的库时才该用
PRIVATE,否则应设置为PUBLIC。 -
全局项目设置说明:
上述部分指令如果去除
target_前缀和部分参数,可转为对所有项目的设置的指令。
全局配置
以下指令对所有项目都生效
1 | |
读取配置
反向获取关于项目的一些配置信息
1 | |
文件系统
既然是基于文件的生成系统,自然经常需要和文件系统打交道。
文件处理
1 | |
路径计算
1 | |
其他特殊指令
其他一些特殊但常用的指令
1 | |
CMakePresets
https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html
“CMakePresets.json”是 CMake 的配置文件,存放在项目的根目录中,用于配置一些 CMake 构建选项。
示例内容如下:
1 | |
配置完毕后生成时通过添加--preset选项,如cmake --preset=<presetName>指令使用。
使用技巧
-
仅添加些文件到 CMake 生成的解决方案文件夹中?
无法直接支持,但可使用
add_custom_target指令间接实现:
https://stackoverflow.com/questions/20251829/is-it-possible-to-add-files-to-a-cmake-generated-solution-folder-in-visual-studi