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的构建流程分两步:
- 配置阶段:CMake读取
CMakeLists.txt,生成构建系统文件(比如Makefile或Visual Studio工程) - 构建阶段:用生成的构建系统去编译代码
实际操作起来就三条命令:
# 第一步:创建构建目录(我习惯叫 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才能真正“活”起来。