05. 现代构建系统:CMake 来了!
1. 什么是CMake
1.1 CMake的定义
CMake(Cross-platform Make)是一个开源、跨平台的构建系统生成器。
它本身并不直接编译代码,而是读取CMakeLists.txt文件,检测编译器和系统环境,根据项目配置,生成特定构建文件,比如:
make构建系统的Makefile文件Ninja构建系统的build.ninja文件Windows构建系统的Visual Studio工程文件.sln/.vcxproj
有了这些构建文件,构建工具就可以据此完成实际的编译工作,生成最终的可执行文件/库
┌─────────────────┐
│ CMakeLists.txt │ (用户编写)
└────────┬────────┘
↓
┌─────────────────┐
│ cmake │ (配置和生成)
└────────┬────────┘
↓
┌─────────────────┐
│ Makefile │ (生成的构建文件)
│ build.ninja │
│ .sln/.vcxproj │
└────────┬────────┘
↓
┌─────────────────┐
│ make/ninja/ │ (实际构建工具)
│ msbuild │
└────────┬────────┘
↓
┌─────────────────┐
│ 可执行文件/库 │ (最终产物)
└─────────────────┘
总结:
CMake是一个跨平台的构建系统生成器(build system generator)make、ninja、MSBuild、Xcode等是构建系统- 构建系统最终会调用具体编译器,例如
gcc、g++、clang等来编译源文件,最终生成可执行文件或库。
1.2 CMake的核心组件
CMake生态系统包含多个组件,以下简要说明。
1.2.1 cmake
核心命令行工具,用于配置和生成构建系统。
1.2.2 ctest
CTest是CMake内置的测试驱动程序,它允许你将测试与项目的构建系统紧密集成,并轻松运行、管理和报告测试结果。
主要特性:
- 自动测试发现 - 自动发现和运行测试
- 并行执行 - 支持并行运行测试以加快速度
- 结果报告 - 生成详细的测试报告
- CDash集成 - 可以提交结果到
CDash仪表板 - 超时控制 - 防止测试无限运行
- 正则匹配 - 通过输出验证测试结果
1.2.3 cpack
CPack是CMake的打包工具,可以一键生成多种安装包,支持的包格式:
| 平台 | 包格式 | 描述 |
|---|---|---|
| Windows | NSIS | Windows安装向导 |
| ZIP | 压缩包 | |
| MSI | Windows Installer | |
| WiX | 高级Windows安装包 | |
| Linux | DEB | Debian/Ubuntu包 |
| RPM | RedHat/CentOS/Fedora包 | |
| TGZ/TBZ2 | 压缩归档 | |
| macOS | DragNDrop | DMG磁盘映像 |
| Bundle | macOS应用程序包 | |
| productbuild | macOS安装包 | |
| 通用 | ZIP/TGZ | 跨平台压缩包 |
1.2.4 cmake-gui
跨平台的图形配置工具,提供友好的界面:
主要功能:
- 可视化变量编辑
- 变量搜索和分组
- 高级选项配置
- 生成器选择
- 配置保存和加载
使用场景:
- 首次配置复杂项目
- 不熟悉命令行的用户
- 需要查看所有可配置选项
- Windows平台开发
1.2.5 ccmake
基于curses的命令行交互式配置工具(Unix/Linux):
ccmake -S . -B build
# 进入交互界面
# c - 配置
# g - 生成
# q - 退出
1.3 CMake支持的语言
CMake主要用于C和C++项目,但也支持其他语言:
C- 完整支持C++- 完整支持(包括C++11/14/17/20/23标准)CUDA-NVIDIA GPU编程Fortran- 科学计算Objective-C/C++-macOS/iOS开发Swift-Apple生态系统ASM- 汇编语言C#- 通过Visual Studio生成器Java- 通过FindJava模块
2. CMake的发展历史
2.1 诞生背景(1999-2000年)
CMake由Kitware公司开发,最初是为了解决ITK(Insight Segmentation and Registration Toolkit,医学图像处理工具包)项目的跨平台构建问题。
历史背景:
1999年,美国国家医学图书馆资助开发ITK项目- 项目需要在
Windows、Unix、macOS等多个平台上编译 - 现有的构建工具
Autotools在Windows上表现不佳 Visual Studio项目文件无法跨平台使用
KDE的助力:
CMake的流行离不开KDE4的选择。KDE开发者在使用Autotools近10年之后,终于决定为KDE4项目选择一个新的工程构建工具。- 之所以如此,用
KDE开发者们自己话来说,就是:只有少数几个编译专家能够掌握KDE现在的构建体系。 - 在经历了
unsermake,scons以及CMake的选型和尝试之后,KDE4最终决定使用CMake作为自己的构建系统。 - 在迁移过程中,进展异常的顺利,并获得了
CMake开发者的支持。所以,目前的KDE4开发版本已经完全使用CMake来进行构建。 - 随着
CMake在KDE4项目中的成功,越来越多的项目开始使用CMake来构建,这也使得CMake成为一个主流的构建体系。
2.2 重要里程碑
| 年份 | 版本 | 重要特性 |
|---|---|---|
| 2000 | CMake 1.0 | 首个正式版本发布 |
| 2004 | CMake 2.0 | 引入target_link_libraries等现代特性 |
| 2014 | CMake 3.0 | 重大版本更新,现代CMake开始 |
| 2026 | CMake 4.0+ | 新一代CMake架构(正在开发) |
2.3 现代CMake
# 现代方式:基于target的属性传播
add_executable(myapp main.cpp)
target_include_directories(myapp PRIVATE ${SOME_LIB_INCLUDE_DIR})
target_compile_definitions(myapp PRIVATE SOME_DEFINE)
target_link_libraries(myapp PRIVATE some_lib)
现代CMake的核心理念:
Target-based- 以目标(target)为中心Property Propagation- 属性自动传播Interface Libraries- 接口库概念Usage Requirements- 使用需求(PRIVATE/PUBLIC/INTERFACE)
3. 为什么选择CMake
3.1 跨平台能力(一份代码,到处构建)
CMake最大的优势是真正的跨平台。
同一套源代码,只需编写一次CMakeLists.txt,即可在不同的操作系统(如Windows、Linux、macOS)和IDE上使用CMake通过读取CMakeLists.txt,生成适用于不同平台的本地构建文件(如Makefile或Visual Studio项目文件)
支持的操作系统:
Windows(7/8/10/11/Server)Linux(所有主流发行版)macOS(包括Apple Silicon)Unix变种(FreeBSD、OpenBSD、Solaris等)iOS、Android、嵌入式Linux
支持的IDE:
Visual Studio(2010-2022及以后)XcodeCLionQt CreatorVS Code(通过CMake Tools扩展)
3.2 行业标准地位
CMake已成为C++项目构建的事实标准,据统计:
- 月下载量超过
200万次 GitHub上超过50%的C++项目使用CMake- 几乎所有主流
C++库都提供CMake支持
使用CMake的知名项目:
| 项目类别 | 典型项目 |
|---|---|
| 编译器 | LLVM/Clang、GCC(部分) |
| 图形库 | OpenCV、VTK、ITK、OpenSceneGraph |
| 游戏引擎 | Godot Engine |
| 科学计算 | Eigen、Boost(部分)、BLAS/LAPACK |
| 数据库 | MySQL、MongoDB、SQLite(部分) |
| 网络库 | gRPC、libcurl、ZeroMQ |
| 桌面环境 | KDE、Qt(构建系统) |
| 浏览器 | Chromium项目部分模块 |
| AI/ML | TensorFlow、PyTorch(C++部分)、ONNX |
3.3 强大的依赖管理
CMake提供了强大的包查找机制:
- 自动查找 - 智能搜索库的安装位置
- 版本控制 - 可以指定所需版本
- 组件选择 - 按需加载库的特定组件
- 传递依赖 - 自动处理依赖的依赖
3.4 活跃的社区支持
- 官方文档完善 - 详细的参考手册和教程
- 社区活跃 -
Discourse论坛、StackOverflow - 企业支持 -
Kitware提供商业支持和培训 - 定期更新 - 每年
3-4个新版本发布
4. 总结:何时选择CMake
✅ 跨平台C/C++项目
✅ 需要支持多种IDE
✅ 有复杂的依赖关系
✅ 团队成员使用不同平台
✅ 需要与现有CMake生态集成
✅ 需要生成安装包
✅ 需要完善的测试支持








