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。 |
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 done 和 Generating done,说明成功了。这时候 build 目录下会多出很多文件,其中最重要的就是 Makefile(如果你用的是Unix Makefiles生成器)或者 build.ninja(如果你用的是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)。
cmake --build . 来编译,而不是直接敲make。不过咱们这节以Linux/macOS为例,Windows用户请确保装了MinGW或WSL。
3.6 运行可执行文件
直接运行:
./my_app
输出:
Hello, CMake!
成了。你亲手完成了第一个CMake项目的完整流程。
3.7 核心流程可视化
我把整个流程画成了一张图,方便你理解每一步之间的关系:
这张图把整个过程串起来了。你从左边写代码、右边写配置,中间用cmake生成构建系统,然后make/ninja编译,最后得到可执行文件。每一步都清晰可见。
3.8 避坑指南
我刚开始用CMake的时候,踩过几个坑,跟你说说:
- 忘记建build目录:直接在源码目录里跑cmake,结果一堆中间文件混进来。后来我养成了习惯,每次新建项目第一件事就是
mkdir build && cd build。 - cmake版本太低:有一次我在老服务器上跑cmake,结果报错说
cmake_minimum_required指定的版本太高。后来我改成3.10,兼容性就好多了。 - 拼写错误:
add_executable写成add_exectuable,cmake会直接报错。嗯,这种低级错误我犯过不止一次。
3.9 小结
这一节我们做了四件事:写源码、写CMakeLists.txt、用cmake生成构建系统、用make编译并运行。这是CMake最基础的工作流,也是你后续所有复杂项目的基础。
说白了,CMake就是个“翻译官”——你把项目结构告诉它,它帮你生成make能读懂的文件。剩下的脏活累活,交给make去干。
下一节,我们会在这个基础上,加入头文件、多个源文件、库依赖等真实项目必备的元素。但今天,先享受一下“Hello, CMake!”带来的成就感吧。