一、CMake初识:什么是CMake、CMake与Makefile的关系、CMake的核心价值、安装CMake

1.1 什么是CMake?

CMake,全称是Cross-platform Make。说白了,它是一个跨平台的构建系统生成器

你想想看,我们写C++代码,最终要变成可执行文件。这个过程需要编译、链接。不同平台(Windows、Linux、macOS)用的编译器不一样,链接器也不一样。手动写Makefile?太累了。而且换个平台,Makefile可能就得重写。

CMake就是来解决这个问题的。它不直接编译你的代码,而是生成对应平台的构建文件。比如在Linux上生成Makefile,在Windows上生成Visual Studio的.sln工程文件。

我个人习惯把CMake比作一个翻译官。你只需要用一种统一的语言(CMakeLists.txt)描述你的项目结构,CMake就能把它翻译成各个平台能理解的构建脚本。

核心定义:CMake是一个开源的、跨平台的构建系统生成工具。它使用CMakeLists.txt文件来描述项目的构建过程,然后生成本地化的构建文件(如Makefile、Ninja build文件、Visual Studio工程文件等)。

1.2 CMake与Makefile的关系

很多初学者会问:CMake和Makefile到底什么关系?是不是学了CMake就不用学Makefile了?

嗯,这里要注意。它们不是替代关系,而是上下游关系

Makefile是Make工具的输入文件。Make工具(比如GNU Make)读取Makefile,然后执行编译、链接等命令。Makefile的语法比较原始,写起来很繁琐,尤其是跨平台的时候。

CMake则是更高一层的工具。它读取CMakeLists.txt,然后生成Makefile(或其他构建文件)。所以流程是:

CMakeLists.txt → CMake → Makefile → Make → 可执行文件

我在项目中遇到过不少同事,直接手写Makefile,结果项目一复杂,依赖关系理不清,编译报错找半天。后来换成CMake,清爽多了。

说白了,CMake是Makefile的生成器,而不是替代品。你仍然需要Make来执行编译,但你不必亲手写Makefile了。

对比项 CMake Makefile
定位 构建系统生成器 构建脚本
跨平台 原生支持,自动适配 需要手动处理平台差异
语法复杂度 相对简单,可读性强 语法晦涩,容易出错
依赖管理 内置find_package等机制 需要手动写规则
适用场景 中大型项目、跨平台项目 小型项目、嵌入式系统

1.3 CMake的核心价值

为什么CMake能成为C++社区的事实标准?我总结了几个核心价值:

  • 跨平台能力:一套CMakeLists.txt,Windows、Linux、macOS通吃。我曾经维护过一个项目,在三个平台上跑,CMake帮了大忙。
  • 模块化与可复用:CMake支持模块化设计。你可以把通用的构建逻辑写成模块,多个项目共享。比如我写了一个FindXXX.cmake,团队里所有人都能用。
  • 强大的依赖管理:通过find_package、FetchContent等命令,可以轻松管理第三方库。不用再手动下载、配置头文件路径和库路径了。
  • 支持多种生成器:除了Makefile,还能生成Ninja、Visual Studio、Xcode等工程文件。你想想看,一个命令就能切换构建工具,多方便。
  • 活跃的社区:CMake社区非常活跃,遇到问题基本都能搜到解决方案。而且现代C++项目(如LLVM、Qt、OpenCV)都在用CMake。

避坑指南:我曾经犯过一个错误——在CMakeLists.txt里硬编码了绝对路径。结果项目换了个目录,编译直接挂了。记住:永远使用相对路径和CMake变量(如CMAKE_SOURCE_DIR、CMAKE_BINARY_DIR)。

1.4 安装CMake

安装CMake其实很简单。不同平台有不同的方式,我分别说一下。

Linux(Ubuntu/Debian)

sudo apt update
sudo apt install cmake

如果想装最新版,建议从官网下载二进制包,或者用pip安装:

pip install cmake

macOS

brew install cmake

Windows

去CMake官网下载安装包,或者用包管理器:

choco install cmake

安装完成后,验证一下:

cmake --version

如果看到版本号,说明安装成功了。

注意:Windows用户记得把CMake的bin目录加到系统PATH环境变量里,否则命令行里找不到cmake命令。

1.5 本章知识体系

为了让你更直观地理解本章内容,我画了一张图:

CMake初识:知识体系 CMake 跨平台构建系统生成器 CMakeLists.txt → CMake → Makefile → Make → 可执行文件 跨平台 | 模块化 | 依赖管理 | 多生成器 | 社区活跃 核心价值 Linux / macOS / Windows 安装方式

这张图把本章的核心内容串起来了。从CMake的定义出发,到它与Makefile的关系,再到它的核心价值,最后是安装方法。你跟着这个脉络走,就能建立起对CMake的初步认识。

个人建议:刚开始学CMake,不要急着看复杂语法。先装好环境,写一个最简单的CMakeLists.txt,编译一个hello world。跑通了,信心就有了。我记得我第一次用CMake编译成功时,那种感觉——嗯,真不错。


公众号:蓝海资料掘金营,微信deep3321