2、第一个CMake项目:CMakeLists.txt文件结构、cmake_minimum_required、project()命令、add_executable()命令、构建与运行

2.1 从零开始:CMakeLists.txt 长什么样?

好,咱们直接上手。第一个CMake项目,说白了就是写一个叫 CMakeLists.txt 的文件。这个文件是CMake的“剧本”,它告诉CMake:你的项目叫什么、用什么语言、要编译哪些源文件。

我个人习惯,每新建一个C++项目,第一件事就是在项目根目录下创建这个文件。嗯,别小看它,整个构建系统的灵魂都在这里。

一个最基础的 CMakeLists.txt 长这样:

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

就三行。是不是比你想象中简单?

2.2 cmake_minimum_required:版本红线

第一行 cmake_minimum_required(VERSION 3.10),这行命令设定了CMake的最低版本要求。

为什么要加这个?我在项目中遇到过,有人用新版本CMake写了些高级语法,结果同事的机器上装的是老版本,一跑就报错。场面一度很尴尬。

所以这条命令的作用就是:如果当前CMake版本低于3.10,直接报错退出。相当于给项目设了个“门槛”。

注意:版本号别写太高。比如你写个 3.30,那大部分人的机器都得升级。建议根据你实际使用的CMake特性来定,一般写 3.10 或 3.16 比较稳妥。

2.3 project():给项目起个名

第二行 project(HelloWorld),这行命令干了三件事:

  • 给项目取了个名字,叫 HelloWorld
  • 自动创建了两个变量:PROJECT_NAME 和 PROJECT_SOURCE_DIR
  • 默认启用了C和C++语言支持

说白了,这就是项目的“身份证”。你想想看,如果项目连名字都没有,后面怎么引用它?

如果你想指定语言,可以这样写:

project(HelloWorld LANGUAGES CXX)

这样CMake就只检测C++编译器,不会去管C编译器了。我个人习惯,纯C++项目都会加上 LANGUAGES CXX,省得CMake多干活。

2.4 add_executable():生成可执行文件

第三行 add_executable(hello main.cpp),这行命令告诉CMake:

  • 我要生成一个叫 hello 的可执行文件
  • 它的源代码是 main.cpp

这里有个细节:hello 是目标名(target name),在Windows上会生成 hello.exe,在Linux/macOS上会生成 hello。CMake会自动处理平台差异。

如果有多个源文件呢?很简单,全部列出来:

add_executable(hello main.cpp utils.cpp logger.cpp)

我曾经见过有人把几百个源文件全写在一行里,看得我头皮发麻。后面我会教你怎么用变量和函数来管理,现在先记住基本用法就行。

2.5 构建与运行:三步走

文件写好了,怎么编译?CMake的构建流程分两步:

  1. 配置阶段:CMake读取 CMakeLists.txt,生成构建系统文件(比如Makefile或Visual Studio工程)
  2. 构建阶段:用生成的构建系统去编译代码

实际操作起来就三条命令:

# 第一步:创建构建目录(我习惯叫 build)
mkdir build && cd build

# 第二步:配置项目
cmake ..

# 第三步:编译
cmake --build .

为什么要单独建一个 build 目录?这叫“out-of-source build”,说白了就是把生成的临时文件和源码分开。我刚开始学的时候,直接在源码目录里跑 cmake .,结果目录里乱七八糟的,后来再也不敢了。

运行生成的可执行文件:

# Linux/macOS
./hello

# Windows
hello.exe
小技巧:用 cmake --build . 而不是直接敲 make,这样你的构建命令在所有平台上都通用。Windows上用Visual Studio也能跑。

2.6 完整示例:动手试试

来,咱们写一个完整的例子。先创建项目目录结构:

my_project/
├── CMakeLists.txt
└── main.cpp

main.cpp 内容:

#include <iostream>

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

CMakeLists.txt 内容:

cmake_minimum_required(VERSION 3.10)
project(MyFirstProject LANGUAGES CXX)
add_executable(my_app main.cpp)

然后执行构建:

mkdir build
cd build
cmake ..
cmake --build .
./my_app

你应该能看到输出:Hello, CMake!

2.7 常见问题与避坑

问题 原因 解决方法
CMake Error: The source directory does not appear to contain CMakeLists.txt cmake命令指定的路径下没有CMakeLists.txt 检查路径是否正确,确保文件名拼写无误
CMake Error: CMAKE_CXX_COMPILER not found 没有安装C++编译器 安装g++、clang或Visual Studio Build Tools
fatal error: iostream: No such file or directory 编译器找不到标准库头文件 检查编译器安装是否完整,或指定 CMAKE_CXX_STANDARD

我曾经在Windows上折腾了一下午,就是因为忘记装Visual Studio的“使用C++的桌面开发”工作负载。嗯,这种坑踩过一次就记住了。

2.8 本章小结

咱们这一章干了什么?

  • 学会了写一个三行的 CMakeLists.txt
  • 理解了 cmake_minimum_required 是版本门槛
  • 知道了 project() 给项目起名并设置语言
  • 掌握了 add_executable() 生成可执行文件
  • 跑通了“配置→构建→运行”的完整流程

下一章,咱们会深入聊聊 变量——CMake里最基础也最重要的概念。到时候你会发现,有了变量,CMakeLists.txt才能真正“活”起来。