一、CMake初体验:什么是CMake?为什么选择CMake?安装与第一个Hello World项目

大家好,我是你们的老朋友。今天咱们正式开启《CMake实战100例》的第一章。

说实话,我接触CMake也挺早的。那时候还在用Makefile手写编译规则,一个项目几十个源文件,每次新增文件都要改Makefile,改完还经常漏掉依赖。后来换了CMake,感觉整个人都轻松了。嗯,这玩意儿确实值得学。

1.1 什么是CMake?

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

你想想看,我们写C++代码,最终要编译成可执行文件。Windows上用Visual Studio,Linux上用g++,macOS上可能用Clang。每个平台的编译命令、链接参数、库路径都不一样。如果每个平台都手写一套构建脚本,那维护成本就太高了。

CMake解决的就是这个问题。你只需要写一份CMakeLists.txt,CMake就能自动生成对应平台的构建文件——比如Linux上的Makefile,Windows上的Visual Studio解决方案,macOS上的Xcode项目。

核心思想:一次编写,到处构建。

1.2 为什么选择CMake?

我经常被问到:市面上有那么多构建工具,为什么偏偏选CMake?

我个人习惯从这几个角度来评估:

  • 跨平台能力:CMake支持Windows、Linux、macOS、Android、iOS等主流平台。我在项目中遇到过从Linux迁移到Windows的情况,CMakeLists.txt基本没动,只改了几个路径配置就搞定了。
  • 生态成熟:现在几乎所有C++开源项目都用CMake。你随便去GitHub上拉个C++项目,十有八九都有CMakeLists.txt。学CMake就等于拿到了进入开源世界的钥匙。
  • 模块化支持:CMake的find_package机制可以自动查找第三方库。我记得有一次集成OpenCV,就一行find_package(OpenCV REQUIRED),CMake自动找到了头文件和库路径,省了我半天时间。
  • 现代CMake语法:从CMake 3.0开始,引入了target-oriented的写法,比老版本更清晰、更安全。我们这门课会全部使用现代CMake风格。
特性 CMake 手写Makefile 其他工具(如Scons)
跨平台 ✅ 原生支持 ❌ 需要手动适配 ⚠️ 部分支持
学习曲线 中等 陡峭 中等
生态 极好 一般 较弱
IDE集成 ✅ VS、CLion、QtCreator等 ❌ 需插件 ⚠️ 有限

1.3 安装CMake

安装CMake其实很简单。不同平台的方法我列一下:

Windows

  • 去官网下载安装包:https://cmake.org/download/
  • 安装时记得勾选"Add CMake to system PATH"
  • 安装完成后,打开命令行输入cmake --version验证

Linux(Ubuntu/Debian)

sudo apt update
sudo apt install cmake
cmake --version

macOS

brew install cmake
cmake --version

小提示:建议安装CMake 3.16及以上版本。我们课程中会用到一些现代CMake特性,版本太低可能不支持。

1.4 第一个Hello World项目

光说不练假把式。咱们直接上手写一个Hello World。

先创建项目目录:

mkdir cmake_hello_world
cd cmake_hello_world

然后写一个最简单的C++源文件 main.cpp

#include <iostream>

int main() {
    std::cout << "Hello, CMake!" << std::endl;
    return 0;
}

接着,在项目根目录创建 CMakeLists.txt

cmake_minimum_required(VERSION 3.16)
project(HelloWorld)

add_executable(hello main.cpp)

这三行代码是什么意思?我解释一下:

  • cmake_minimum_required(VERSION 3.16):指定CMake最低版本。如果系统CMake版本低于3.16,会报错。
  • project(HelloWorld):定义项目名称。这个名称会被CMake内部使用。
  • add_executable(hello main.cpp):告诉CMake,我们要生成一个可执行文件,名字叫hello,源文件是main.cpp

好了,现在开始构建:

mkdir build
cd build
cmake ..
cmake --build .

为什么要在build目录里构建?这是我个人的习惯——out-of-source构建。把构建产物和源代码分开,避免污染源码目录。你想想看,如果直接在源码目录里生成一堆.o文件和可执行文件,那目录就乱成一锅粥了。

构建完成后,运行:

./hello

你应该会看到输出:

Hello, CMake!

注意:如果你在Windows上使用Visual Studio,CMake会生成.sln解决方案文件。你可以直接用Visual Studio打开build目录下的HelloWorld.sln,然后按F5运行。

1.5 核心流程:CMake是如何工作的?

为了让你更直观地理解CMake的工作流程,我画了一张图:

CMake构建流程 编写 CMakeLists.txt 定义项目、源文件、依赖 cmake .. 生成构建系统文件 生成构建文件 Makefile / .sln cmake --build . 调用编译器进行编译 编译器(g++/cl/MSVC) 编译源文件,链接库 生成可执行文件 hello.exe / hello ./hello 整个过程:CMakeLists.txt → cmake生成构建文件 → cmake --build调用编译器 → 生成可执行文件

这张图展示了CMake的完整工作流程。简单来说就是两步:

  1. 配置阶段:运行cmake ..,CMake读取CMakeLists.txt,生成构建系统文件(Makefile或.sln)。
  2. 构建阶段:运行cmake --build .,CMake调用底层编译器,完成编译和链接。

为什么要分成两步?因为配置阶段只做一次,除非你修改了CMakeLists.txt。而构建阶段可以反复执行,每次修改源码后只需要重新构建即可。

避坑指南:我曾经遇到过一个问题——修改了CMakeLists.txt后,直接运行cmake --build .,结果发现修改没生效。后来才意识到,修改CMakeLists.txt后需要重新运行cmake ..进行配置。记住:改源码只需重新构建,改CMakeLists.txt需要重新配置

1.6 本章小结

这一章我们走完了CMake的入门流程。你学会了:

  • CMake是什么——一个跨平台的构建系统生成器
  • 为什么选CMake——跨平台、生态好、现代语法
  • 如何安装CMake——各平台都有对应的安装方式
  • 第一个Hello World项目——从CMakeLists.txt到可执行文件
  • CMake的工作流程——配置阶段和构建阶段

嗯,第一章的内容就到这里。记住,CMake没那么神秘,它就是一个帮你管理编译过程的工具。你写CMakeLists.txt,它帮你生成构建文件,然后调用编译器干活。就这么简单。

下一章我们会深入CMakeLists.txt的语法,看看变量、条件判断、循环这些基础元素怎么用。到时候见。


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