2、第一个CMake项目:创建CMakeLists.txt、cmake_minimum_required、project命令、add_executable、构建与运行

说实话,学任何新工具,最怕的就是光看不练。CMake 这东西,你光看文档看三天,不如亲手搭一个项目跑一遍来得实在。这一章我们就来动手,从零创建一个真正的 CMake 项目。

我会带你走完整个流程:写 CMakeLists.txt、配置项目、编译、运行。每一步我都会告诉你「为什么这么做」,而不是让你死记硬背命令。

2.1 项目结构:先搭个架子

我个人习惯,每个 CMake 项目都单独建一个目录。这样干净,不会跟其他代码混在一起。咱们先创建一个文件夹,就叫 hello_cmake

mkdir hello_cmake
cd hello_cmake

然后在这个目录里,放两个文件:

  • main.cpp —— 我们的 C++ 源代码
  • CMakeLists.txt —— CMake 的构建脚本

main.cpp 的内容很简单,就是打印一行字:

#include <iostream>

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

嗯,这里要注意:文件名不要写错,CMakeLists.txtC 是大写,L 也是大写。我见过不少新手因为文件名写成了 cmakelists.txt,结果 CMake 死活不认,折腾半天才发现是大小写的问题。

2.2 编写 CMakeLists.txt:项目的“宪法”

CMakeLists.txt 是 CMake 项目的核心配置文件。说白了,它就是告诉 CMake:「我这个项目叫什么名字、用什么版本的 CMake、要编译哪些源文件」。咱们先写一个最精简的版本:

cmake_minimum_required(VERSION 3.10)
project(HelloCMake)
add_executable(hello main.cpp)

就三行。咱们一行一行拆开讲。

2.2.1 cmake_minimum_required:设定最低版本

这一行的作用,是告诉 CMake:「我这个项目至少需要 3.10 版本才能构建」。如果用户机器上的 CMake 版本低于 3.10,CMake 会直接报错退出。

为什么要写这个?我在项目中遇到过好几次,同事用老版本的 CMake 来构建新项目,结果某些命令不支持,编译失败。加了这一行,就能提前把问题暴露出来,而不是等到编译报错才去排查。

我的建议:版本号不要写得太高,也不要太低。3.10 是个比较稳妥的选择,既支持了现代 CMake 的大多数特性,又兼容了大部分 Linux 发行版自带的 CMake 版本。

2.2.2 project:给项目起个名字

project(HelloCMake) 这一行,就是给项目取个名字。这个名字会影响到后面的一些变量,比如 PROJECT_NAMEPROJECT_SOURCE_DIR 等等。

你想想看,如果你的项目有多个子模块,每个模块都有自己的 CMakeLists.txt,那 project() 就能帮你区分当前是在哪个模块里。它还会自动设置一些语言相关的变量,比如 C++ 标准。

这里有个小细节:project() 命令还可以指定语言,比如 project(HelloCMake CXX) 表示只启用 C++ 支持。不过大多数情况下,默认就够了。

2.2.3 add_executable:生成可执行文件

add_executable(hello main.cpp) 的意思是:用 main.cpp 这个源文件,编译出一个叫 hello 的可执行文件。

语法很简单:add_executable(目标名 源文件1 源文件2 ...)。如果有多个源文件,就依次列在后面,用空格隔开。

注意:目标名 hello 就是最终生成的可执行文件的名字。在 Windows 上会生成 hello.exe,在 Linux/macOS 上会生成 hello

2.3 构建与运行:见证奇迹的时刻

CMake 的构建过程分为两步:配置(Configure)编译(Build)。配置阶段生成 Makefile 或 Visual Studio 工程文件,编译阶段才是真正的编译链接。

我个人推荐使用「out-of-source」构建,也就是在项目目录外单独建一个 build 目录来放编译产物。这样源代码目录不会被污染,想清理的时候直接删掉 build 目录就行。

操作如下:

# 在 hello_cmake 目录下
mkdir build
cd build

# 配置阶段
cmake ..

# 编译阶段
cmake --build .

解释一下:

  • cmake .. 表示「去上一级目录找 CMakeLists.txt,然后根据它生成构建系统」。
  • cmake --build . 表示「在当前目录执行编译」。这个命令会自动调用 make 或 ninja 等底层工具。

编译成功后,你会看到 build 目录下多了一个 hello(或 hello.exe)文件。运行它:

./hello

输出:

Hello, CMake!

看到这行输出,恭喜你,你的第一个 CMake 项目就跑起来了!

我曾经踩过的坑:在 Windows 上,如果你用 Visual Studio 的生成器,cmake .. 之后会生成一个 .sln 解决方案文件。这时候 cmake --build . 也能编译,但如果你直接双击 .sln 打开 Visual Studio,记得选择正确的配置(Debug/Release)和平台(x86/x64)。

2.4 知识体系总览

下面这张图,把本章的核心逻辑串起来了。你可以把它当作一个「速查地图」,以后写 CMakeLists.txt 时照着这个流程走就行。

第一个CMake项目:核心流程 1. 创建项目结构 hello_cmake/ 2. 编写CMakeLists.txt cmake_minimum_required 3. 配置 cmake .. 4. 编译 cmake --build . 5. 运行 ./hello CMakeLists.txt 内容 cmake_minimum_required(VERSION 3.10) project(HelloCMake) add_executable(hello main.cpp) # 三行命令,各司其职 # 版本 → 项目名 → 可执行文件

2.5 本章要点速查

命令/概念 作用 常见错误
cmake_minimum_required 指定 CMake 最低版本 版本号写错,导致命令不兼容
project() 定义项目名称和语言 忘记写,导致变量未定义
add_executable() 声明可执行文件及其源文件 源文件路径写错,编译找不到文件
cmake .. 配置项目,生成构建系统 在源码目录内执行,污染源码
cmake --build . 执行编译 忘记先配置,直接编译报错
一个小技巧:如果你不确定 CMake 命令的用法,可以在终端输入 cmake --help-command 命令名,比如 cmake --help-command add_executable,CMake 会直接打印出该命令的完整文档。

好了,这一章的内容就到这里。你现在已经掌握了 CMake 项目最基本的「三板斧」:cmake_minimum_requiredprojectadd_executable。别看只有三行命令,它们是所有 CMake 项目的基石。后面的章节,我们会在这个基础上不断加料,让它越来越强大。

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