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.txt 的 C 是大写,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 来构建新项目,结果某些命令不支持,编译失败。加了这一行,就能提前把问题暴露出来,而不是等到编译报错才去排查。
2.2.2 project:给项目起个名字
project(HelloCMake) 这一行,就是给项目取个名字。这个名字会影响到后面的一些变量,比如 PROJECT_NAME、PROJECT_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 项目就跑起来了!
cmake .. 之后会生成一个 .sln 解决方案文件。这时候 cmake --build . 也能编译,但如果你直接双击 .sln 打开 Visual Studio,记得选择正确的配置(Debug/Release)和平台(x86/x64)。
2.4 知识体系总览
下面这张图,把本章的核心逻辑串起来了。你可以把它当作一个「速查地图」,以后写 CMakeLists.txt 时照着这个流程走就行。
2.5 本章要点速查
| 命令/概念 | 作用 | 常见错误 |
|---|---|---|
cmake_minimum_required |
指定 CMake 最低版本 | 版本号写错,导致命令不兼容 |
project() |
定义项目名称和语言 | 忘记写,导致变量未定义 |
add_executable() |
声明可执行文件及其源文件 | 源文件路径写错,编译找不到文件 |
cmake .. |
配置项目,生成构建系统 | 在源码目录内执行,污染源码 |
cmake --build . |
执行编译 | 忘记先配置,直接编译报错 |
cmake --help-command 命令名,比如 cmake --help-command add_executable,CMake 会直接打印出该命令的完整文档。
好了,这一章的内容就到这里。你现在已经掌握了 CMake 项目最基本的「三板斧」:cmake_minimum_required、project、add_executable。别看只有三行命令,它们是所有 CMake 项目的基石。后面的章节,我们会在这个基础上不断加料,让它越来越强大。