最小的CMakeLists案例
在本节中,我们将从零开始创建一个简单的 C++ 项目,展示如何使用 CMake 构建一个可执行文件。
准备源代码与配置文件
创建 main.cpp 文件,内容如下:
// main.cpp
#include <iostream>
int main(){
puts("hello cmake");
}
接下来,在项目目录下创建 CMakeLists.txt 文件,内容如下:
# 设置 CMake 的最低版本
cmake_minimum_required(VERSION 3.20)
# 设置项目名称
project(MinimalCMakeProject)
# 定义一个可执行文件
# 第一个参数是目标名称,第二个参数是源文件路径
add_executable(hello_cmake main.cpp)
配置项目
在项目根目录下,创建一个独立的构建目录(也称为源外构建)。
为什么使用独立构建目录? 这样可以将生成的构建文件与源代码分离,保持项目目录整洁,便于管理。
cmake -S . -B build
-S .
表示让 CMake 查找当前目录中的 CMakeLists.txt 文件,-B build
指定构建文件存放在 build 目录。执行后,CMake 会生成平台相关的构建文件。
成功后,终端将输出类似以下内容:
awe@build$ cmake ..
-- The C compiler identification is GNU 14.2.1
-- The CXX compiler identification is GNU 14.2.1
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done (0.5s)
-- Generating done (0.0s)
-- Build files have been written to: /home/awe/Desktop/code/node/Modern-CMake/examples/step1/build
生成项目
在CMakeLists.txt所在目录中运行以下命令:
cmake --build build
成功后,你将看到类似如下输出:
awe@build$ cmake --build .
[ 50%] Building CXX object CMakeFiles/hello_cmake.dir/main.cpp.o
[100%] Linking CXX executable hello_cmake
[100%] Built target hello_cmake
编译完成后,可执行文件会出现在 build 目录下,运行它:
./build/hello_cmake
最终可执行目录结构:
awe@step1$ tree -L 2
.
├── build
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ ├── cmake_install.cmake
│ ├── hello_cmake
│ └── Makefile
├── CMakeLists.txt
└── main.cpp
为什么CMake构建过程分为两步?
配置阶段 (cmake -S . -B build
):配置阶段只解析项目结构和生成规则,不执行实际的编译工作。
配置阶段,CMake会解析 CMakeLists.txt 文件,生成适合当前平台的构建文件(如 Makefile 或 Visual Studio 工程文件.sln等;对于现在的IDE,VS,CLion等都会在CMakeLists.txt文件更新后(半)自动配置,不必手动完成),而且配置过程是有缓存的,第一次构建后第二次配置可以,CMake build/ 直接指定上次构建的缓存,每次增量更新`cmake build/ -DCMAKE_XXX=YYY`(不不过这些构建缓存一般也不能迁移到其他目录,cmake无法保证这个)。
生成阶段(cmake --build build
):
tips: cmake --build build -v 可以输出具体的编译过程
CMake使用第一步生成的构建文件,通过构建文件调用对应的构建工具(msbuild、make、ninja)完成构建,构建工具来调用具体的编译器(如 g++、clang++ 或 cl.exe)进行编译,生成目标文件(如可执行文件.exe或库)。
CMake 配置文件内容的写什么?
CMake 配置文件的核心作用是告诉 CMake 如何将源代码和库文件
转换为可执行文件或其他目标
。
在现代 CMake 中,构建的核心是Target。Target 可以是可执行文件、库文件,甚至是自定义命令。 一个基本的程序至少有一个 Target,以下是一个简单的例子:
# CMake要求第一行必须是cmake_minimum_required VERSION推荐3.20起步,
cmake_minimum_required(VERSION 3.20)
# CMake规定一个项目的根CMakeLists.txt必须要有项目名字。
project(MinimalCMakeProject)
add_executable(hello_cmake main.cpp)
上文CMake命令详解
1. cmake_minimum_required
推荐版本:从 3.20 起步。
此命令不仅要求 CMake 的最低版本,还会设定策略版本。
等价命令:
cmake_policy(VERSION 3.20)
CMake 中的策略版本用于在多个版本之间保留向后兼容的行为。
2. project
project 命令可以设置以下内容:
- VERSION: 项目的版本号。
- DESCRIPTION: 项目的描述。
- HOMEPAGE_URL: 项目主页地址。
- LANGUAGES: 项目支持的编程语言。
调用 project
后,会定义一系列有用的变量,例如:
- PROJECT_SOURCE_DIR: 项目源码的根目录。
- <PROJECT-NAME>_SOURCE_DIR: 当前项目的源码目录。
注意:
如果project
位于顶层 CMakeLists.txt(根级别),会设置以下变量:
- CMAKE_PROJECT_NAME: 顶层项目的名称(仅根项目设置)。
- PROJECT_NAME: 当前项目的名称(最近调用的
project
命令覆盖之前的值)。