3、第一个CMake项目:创建CMakeLists.txt,使用cmake命令生成构建系统,使用make或ninja编译,运行可执行文件

好,咱们直接动手。光说不练假把式,这一节我带你亲手搭一个完整的CMake项目。从零开始,写代码、写CMakeLists.txt、跑cmake、编译、运行——走完这一整套流程,你就算正式入门了。

3.1 项目结构长什么样?

先别想太复杂。一个最简单的CMake项目,只需要两个文件:

  • 一个 main.cpp(你的C++源码)
  • 一个 CMakeLists.txt(CMake的配置文件)

我个人习惯把源码放在 src/ 目录下,但刚开始学,咱们就放根目录,少绕弯子。

目录结构长这样:

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

嗯,就这么简单。你可以在任意位置创建这个文件夹。

3.2 写一个“Hello CMake”

先写C++代码。打开 main.cpp,敲进去:

#include <iostream>

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

这段代码没什么好说的,就是打印一句话。重点在下一步。

3.3 编写CMakeLists.txt

现在创建 CMakeLists.txt,写入以下内容:

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

三行,每行一个作用:

命令 作用
cmake_minimum_required 指定CMake最低版本。低于这个版本会报错。
project 定义项目名称。这里叫 MyFirstProject
add_executable 告诉CMake:我要生成一个可执行文件,名字叫 my_app,源码是 main.cpp
小提示:项目名称和可执行文件名可以不一样。项目名是给CMake内部用的,可执行文件名是最终生成的文件名。我习惯让它们保持一致,但这不是强制要求。

3.4 生成构建系统

打开终端,进入项目目录,执行:

mkdir build
cd build
cmake ..

这里我解释一下为什么建一个 build 目录。你想想看,如果不建这个目录,cmake生成的一大堆中间文件(Makefile、缓存文件等)就会和你的源码混在一起,乱得很。我在项目中见过有人直接把构建产物扔在源码目录里,结果想清理的时候都不知道哪些该删。所以,建一个独立的构建目录,这是行业最佳实践。

执行完 cmake .. 后,你会看到类似这样的输出:

-- The C compiler identification is GNU 11.2.0
-- The CXX compiler identification is GNU 11.2.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /path/to/my_first_cmake_project/build

看到 Configuring doneGenerating done,说明成功了。这时候 build 目录下会多出很多文件,其中最重要的就是 Makefile(如果你用的是Unix Makefiles生成器)或者 build.ninja(如果你用的是Ninja)。

核心概念:cmake本身不编译代码。它只负责生成构建系统的配置文件。真正的编译工作,交给make或ninja去做。

3.5 编译项目

生成好构建系统后,在 build 目录下执行:

make

或者如果你装了Ninja:

ninja

输出应该类似:

Scanning dependencies of target my_app
[ 50%] Building CXX object CMakeFiles/my_app.dir/main.cpp.o
[100%] Linking CXX executable my_app

看到 100%,说明编译完成了。这时候 build 目录下会多出一个可执行文件 my_app(Windows下是 my_app.exe)。

注意:如果你用的是Windows + Visual Studio,cmake默认会生成.sln解决方案文件。这时候你需要用 cmake --build . 来编译,而不是直接敲make。不过咱们这节以Linux/macOS为例,Windows用户请确保装了MinGW或WSL。

3.6 运行可执行文件

直接运行:

./my_app

输出:

Hello, CMake!

成了。你亲手完成了第一个CMake项目的完整流程。

3.7 核心流程可视化

我把整个流程画成了一张图,方便你理解每一步之间的关系:

main.cpp C++ 源码 CMakeLists.txt 构建配置 cmake .. 生成构建系统 Makefile / build.ninja 构建系统配置文件 make / ninja my_app 图:CMake项目构建流程

这张图把整个过程串起来了。你从左边写代码、右边写配置,中间用cmake生成构建系统,然后make/ninja编译,最后得到可执行文件。每一步都清晰可见。

3.8 避坑指南

我刚开始用CMake的时候,踩过几个坑,跟你说说:

  • 忘记建build目录:直接在源码目录里跑cmake,结果一堆中间文件混进来。后来我养成了习惯,每次新建项目第一件事就是 mkdir build && cd build
  • cmake版本太低:有一次我在老服务器上跑cmake,结果报错说 cmake_minimum_required 指定的版本太高。后来我改成 3.10,兼容性就好多了。
  • 拼写错误add_executable 写成 add_exectuable,cmake会直接报错。嗯,这种低级错误我犯过不止一次。
我的建议:刚开始学,别追求花哨。就用这三行CMakeLists.txt,跑通流程再说。等你熟悉了,再慢慢加功能。

3.9 小结

这一节我们做了四件事:写源码、写CMakeLists.txt、用cmake生成构建系统、用make编译并运行。这是CMake最基础的工作流,也是你后续所有复杂项目的基础。

说白了,CMake就是个“翻译官”——你把项目结构告诉它,它帮你生成make能读懂的文件。剩下的脏活累活,交给make去干。

下一节,我们会在这个基础上,加入头文件、多个源文件、库依赖等真实项目必备的元素。但今天,先享受一下“Hello, CMake!”带来的成就感吧。


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