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)
  • makeninjaMSBuildXcode等是构建系统
  • 构建系统最终会调用具体编译器,例如gccg++clang等来编译源文件,最终生成可执行文件或库。

1.2 CMake的核心组件

CMake生态系统包含多个组件,以下简要说明。

1.2.1 cmake

核心命令行工具,用于配置和生成构建系统。

1.2.2 ctest

CTestCMake内置的测试驱动程序,它允许你将测试与项目的构建系统紧密集成,并轻松运行、管理和报告测试结果。

主要特性:

  • 自动测试发现 - 自动发现和运行测试
  • 并行执行 - 支持并行运行测试以加快速度
  • 结果报告 - 生成详细的测试报告
  • CDash集成 - 可以提交结果到CDash仪表板
  • 超时控制 - 防止测试无限运行
  • 正则匹配 - 通过输出验证测试结果

1.2.3 cpack

CPackCMake的打包工具,可以一键生成多种安装包,支持的包格式:

平台包格式描述
WindowsNSISWindows安装向导
ZIP压缩包
MSIWindows Installer
WiX高级Windows安装包
LinuxDEBDebian/Ubuntu包
RPMRedHat/CentOS/Fedora包
TGZ/TBZ2压缩归档
macOSDragNDropDMG磁盘映像
BundlemacOS应用程序包
productbuildmacOS安装包
通用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主要用于CC++项目,但也支持其他语言:

  • 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年)

CMakeKitware公司开发,最初是为了解决ITK(Insight Segmentation and Registration Toolkit,医学图像处理工具包)项目的跨平台构建问题。

历史背景:

  • 1999年,美国国家医学图书馆资助开发ITK项目
  • 项目需要在WindowsUnixmacOS等多个平台上编译
  • 现有的构建工具AutotoolsWindows上表现不佳
  • Visual Studio项目文件无法跨平台使用

KDE的助力:

  • CMake的流行离不开KDE4的选择。
  • KDE开发者在使用Autotools10年之后,终于决定为KDE4项目选择一个新的工程构建工具。
  • 之所以如此,用KDE开发者们自己话来说,就是:只有少数几个编译专家能够掌握KDE现在的构建体系。
  • 在经历了unsermakescons以及CMake的选型和尝试之后,KDE4最终决定使用CMake 作为自己的构建系统。
  • 在迁移过程中,进展异常的顺利,并获得了CMake开发者的支持。所以,目前的KDE4开发版本已经完全使用CMake来进行构建。
  • 随着CMakeKDE4项目中的成功,越来越多的项目开始使用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,即可在不同的操作系统(如WindowsLinuxmacOS)和IDE上使用
CMake通过读取CMakeLists.txt,生成适用于不同平台的本地构建文件(如MakefileVisual Studio项目文件)

支持的操作系统:

  • Windows(7/8/10/11/Server)
  • Linux(所有主流发行版)
  • macOS(包括Apple Silicon)
  • Unix变种(FreeBSDOpenBSDSolaris等)
  • iOSAndroid、嵌入式Linux

支持的IDE:

  • Visual Studio(2010-2022及以后)
  • Xcode
  • CLion
  • Qt Creator
  • VS Code(通过CMake Tools扩展)

3.2 行业标准地位

CMake已成为C++项目构建的事实标准,据统计:

  • 月下载量超过200万次
  • GitHub上超过50%C++项目使用CMake
  • 几乎所有主流C++库都提供CMake支持

使用CMake的知名项目:

项目类别 典型项目
编译器 LLVM/ClangGCC(部分)
图形库 OpenCVVTKITKOpenSceneGraph
游戏引擎 Godot Engine
科学计算 EigenBoost(部分)、BLAS/LAPACK
数据库 MySQLMongoDBSQLite(部分)
网络库 gRPClibcurlZeroMQ
桌面环境 KDEQt(构建系统)
浏览器 Chromium项目部分模块
AI/ML TensorFlowPyTorch(C++部分)、ONNX

3.3 强大的依赖管理

CMake提供了强大的包查找机制:

  • 自动查找 - 智能搜索库的安装位置
  • 版本控制 - 可以指定所需版本
  • 组件选择 - 按需加载库的特定组件
  • 传递依赖 - 自动处理依赖的依赖

3.4 活跃的社区支持

  • 官方文档完善 - 详细的参考手册和教程
  • 社区活跃 - Discourse论坛、StackOverflow
  • 企业支持 - Kitware提供商业支持和培训
  • 定期更新 - 每年3-4个新版本发布

4. 总结:何时选择CMake

✅ 跨平台C/C++项目
✅ 需要支持多种IDE
✅ 有复杂的依赖关系
✅ 团队成员使用不同平台
✅ 需要与现有CMake生态集成
✅ 需要生成安装包
✅ 需要完善的测试支持