cmake 是一款跨平台的构建系统生成工具,它本身不是编译器,也不直接编译代码,核心作用是读取项目里的 CMakeLists.txt 配置文件,根据当前操作系统编译器环境,自动生成对应的原生构建文件,比如 Windows 生成 Visual Studio 工程文件,Linux 生成 Makefile,macOS 可以生成 Xcode 工程或者 Makefile,程序员只需要写一份 cmake 配置,就可以在不同系统完成项目编译,解决传统 Makefile 跨平台兼容性差,不同编译器配置不统一的痛点,C C++ 开源项目几乎普遍使用 cmake,也是嵌入式机器人计算机视觉这类 C++ 项目标配构建工具。
核心定位对照表
| 项目 | 详细说明 |
|---|---|
| 全称 | Cross Platform Make |
| 类型 | 构建生成器,非编译器 |
| 输入文件 | CMakeLists.txt |
| 输出文件 | Makefile VS 工程 Xcode 工程等 |
| 主要语言 | C C++ 项目为主 |
| 核心优势 | 跨平台 可扩展 支持依赖管理 |
深度工作原理
cmake 整个流程分为两个阶段,第一阶段是配置阶段,cmake 读取 CMakeLists.txt,检测系统环境,查找依赖库,判断编译器版本,收集源文件,生成内部缓存信息,第二阶段是生成阶段,按照选定的生成器,输出对应的原生构建文件,第三阶段才是真正编译,调用 make 或者 msbuild 执行编译链接,也就是 cmake 只负责生成构建脚本,真正编译动作还是交给 gcc clang msvc 这些编译器完成。
基础常用指令清单
cmake_minimum_required 设置 cmake 最低版本
project 声明项目名称和支持语言
add_executable 添加可执行程序目标
add_library 添加库目标 静态库或者动态库
target_link_libraries 给目标链接依赖库
include_directories 添加头文件搜索路径
find_package 查找外部依赖包
set 定义变量
基础使用步骤
第一步 在项目根目录新建 CMakeLists.txt,编写项目配置代码
第二步 创建 build 独立构建目录,推荐外部构建,避免源码目录被编译文件污染
第三步 在 build 目录执行 cmake 命令,指定源码路径,选择生成器
第四步 执行构建命令,比如 make,或者打开 VS 工程点击编译
第五步 编译完成之后得到可执行文件或者库文件
和同类工具对比
| 工具 | 特点 | 对比 cmake |
|---|---|---|
| Make | Linux 原生,跨平台差 | cmake 可以生成 Makefile,跨平台能力更强 |
| Autotools | 老牌 GNU 项目工具,配置繁琐 | cmake 语法更简洁,现代项目更偏好 cmake |
| Meson | 新一代构建系统 | cmake 生态成熟,第三方库支持更多 |
| Bazel | 谷歌推出,支持多语言 | cmake 专注 C C++,学习门槛更低 |
常见使用场景清单
C C++ 开源库编译,比如 OpenCV PCL Eigen
嵌入式交叉编译项目,指定交叉编译工具链
多模块大型项目,管理子目录子工程
需要同时支持 Windows Linux Mac 三端的软件项目
常见误区
误区 1 cmake 就是编译器,可以直接把 cpp 变成 exe,实际它只生成构建文件
误区 2 一份 CMakeLists.txt 不需要任何修改,所有系统都能完美编译,实际跨平台的时候依然要处理平台判断宏,依赖差异
误区 3 cmake 只能用于 C C++,它也支持 Fortran,但是主流还是 C C++ 项目
整体总结,cmake 是跨平台构建生成工具,通过一份 CMakeLists.txt 自动生成各平台原生构建脚本,简化多平台 C C++ 项目编译流程,是现代 C++ 开发必备工具,理解它生成构建文件而不是直接编译这个核心特点,就掌握了 cmake 是干什么的核心逻辑。
【常见问题】
问题 1 cmake 是干什么的 它可以直接编译 cpp 代码吗
回答 1 cmake 是干什么的这个知识点里,cmake 本身不能直接编译 cpp 代码,它只负责生成 Makefile 或者 VS 工程,真正编译由 gcc msvc 这类编译器完成。
问题 2 cmake 是干什么的 为什么开源 C++ 项目都要用 cmake
回答 1 cmake 是干什么的核心优势就是跨平台,一份 CMakeLists.txt 可以适配 Windows Linux Mac,统一项目构建流程,所以现代 C++ 开源项目普遍选用 cmake。
问题 3 cmake 是干什么的 和 make 是什么关系
回答 1 cmake 是干什么的里面,cmake 可以生成 Makefile,make 是执行 Makefile 进行编译的工具,cmake 属于上层构建生成器,make 是底层执行工具。
【免责申明】
本文内容为开发工具科普,不同版本 cmake 语法和支持特性会随版本迭代更新,仅作为编程学习参考,不代表所有版本命令完全通用。


