简介

CMake是一个管理源代码构建的工具。

  • 最初,CMake被设计为各种Makefile的生成器。
  • 而今,CMake可以生成现代构建系统。
    CMake广泛用于C和C++,也可以用于构建其他语言的源代码。

CMake的下载与安装

CMake官网:https://cmake.org/
CMake下载:https://cmake.org/download/
MinGW官网:https://www.mingw-w64.org/
MinGW下载:https://sourceforge.net/projects/mingw-w64/files/mingw-w64/

根据系统架构和安装方式自行下载,下载完毕后进行安装和解压。
配置环境变量,使得CMake和GCC随处可用。如:

1
2
C:\PC-APPS\CMake\bin
C:\PC-APPS\mingw64\bin

打开cmd,输入cmakegcc -v测试安装情况。

使用CMake构建C++项目

(1). 创建C++项目

创建一个项目CMakeDemo,其结构如下:

1
2
3
4
5
└─CMakeDemo
├─build
└─src
├─CMakeLists.txt
└─main.cpp

main.cpp

1
2
3
4
5
6
7
8
#include <iostream>
using namespace std;

int main()
{
cout << "Hello World!" << endl;
return 0;
}

CMakeLists.txt

1
2
3
4
5
cmake_minimum_required(VERSION 3.30)

project(Tutorial)

add_executable(Tutorial main.cpp)

注意点:

  • 参数使用空格或分号隔开;如:add_executable(Tutorial main.cpp) 或者add_executable(Tutorial;main.cpp)
  • 使用${VAR}引用变量;

(2). 构建C++项目

CMake的命令是不区分大小写的,但是参数和变量区分大小写。

*

bulid目录下打开cmd,执行cmake ..\src命令:

此处没有指定生成器,若系统中还包含其他生成器,需要手动指定。输入cmake --help查看缺少的选项,需要添加 -G <generator-name>选项。
此处我们使用的是MinGW,因此得到的完整命令为cmake -G "MinGW Makefiles" ..\src

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
C:\Users\Smith\Desktop\WorkSpace\CPP\CMakeDemo\build>cmake -G "MinGW Makefiles" ..\src
-- The C compiler identification is GNU 14.2.0
-- The CXX compiler identification is GNU 14.2.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/PC-APPS/mingw64/bin/gcc.exe - 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: C:/PC-APPS/mingw64/bin/c++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done (2.1s)
-- Generating done (0.0s)
-- Build files have been written to: C:/Users/Smith/Desktop/WorkSpace/CPP/CMakeDemo/build

在当前目录下构建项目,输入cmake --build .

1
2
3
4
5
6
C:\Users\Smith\Desktop\WorkSpace\CPP\CMakeDemo\build>cmake --build .
[ 50%] Building CXX object CMakeFiles/Tutorial.dir/main.cpp.obj
[100%] Linking CXX executable Tutorial.exe
[100%] Built target Tutorial

C:\Users\Smith\Desktop\WorkSpace\CPP\CMakeDemo\build>

此时,在build目录下生成以下文件:

  • 目标文件(target):可执行文件(add_executable)和库文件(add_library);
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    └─CMakeDemo
    ├─build
    │ ├─CMakeFiles
    | ├─cmake_install.cmake
    | ├─CMakeCache.txt
    | ├─Makefile
    | └─Tutorial.exe
    └─src
    ├─CMakeLists.txt
    └─main.cpp

(3). 运行可执行程序

在cmd中运行Tutorial.exe即可执行。

1
2
C:\Users\Smith\Desktop\WorkSpace\CPP\CMakeDemo\build>Tutorial.exe
Hello World!

CMake命令

对象脚本命令(Scripting Commands)

cmake_minimum_required

格式:

1
cmake_minimum_required(VERSION <min>[...<policy_max>] [FATAL_ERROR])

作用:

  • 指定构建项目所需的最低和最高CMake版本,并更新策略设置。若运行的CMake版本低于指定的最低版本,将会停止处理项目并报错。
  • cmake版本号的形式都为major.minor[.patch[.tweak]],如3.22.0,3.13.5。
  • 该命令将变量CMAKE_MINIMUM_REQUIRED_VERSION设置为<min>
  • 该命令隐式调用了cmake_policy(VERSION <min>[...<max>])命令。
参数 选项 作用
<min> 必选 指定最低的CMake版本号
[...<policy_max>] 可选(v3.12新增) 指定最高的CMake版本号(防止项目在引入不兼容的新版本时出现意外问题,确保代码的稳定性和可靠性
[FATAL_ERROR] 可选 若不满足最低版本要求,报错并终止处理项目

示例:

1
2
cmake_minimum_required(VERSION 3.1.3)
camke_minimum_required(VERSION 3.1.3...3.10.5)

注意:

  • 该命令通常放在 CMakeLists.txt 文件的第一行,即在 project 命令之前。这是为了确保所有后续命令都遵循指定的CMake版本要求。
  • 该命令也可以在函数内调用,此时它仅在函数内部生效。然而,不建议这样做,因为这可能会导致版本管理的混乱和潜在的兼容性问题。

工程命令(Project Commands)

project

格式:

1
2
3
4
5
6
project(<PROJECT-NAME> [<language-name>...])
project(<PROJECT-NAME>
[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
[DESCRIPTION <project-description-string>]
[HOMEPAGE_URL <url-string>]
[LANGUAGES <language-name>...])

作用:

  • 设置项目名称,并将其存储在变量PROJECT_NAME中,当从顶层调用CMakeLists.txt时,还将项目名称存储在变量CMAKE_PROJECT_NAME中。
  • 设置项目源目录的绝对路径,将其存储在变量PROJECT_SOURCE_DIR<PROJECT-NAME>_SOURCE_DIR中。
  • 设置项目二进制目录的绝对路径,将其存储在变量PROJECT_BINARY_DIR<PROJECT-NAME>_BINARY_DIR中。
  • (v3.21新增)指定项目是否为顶级项目,将其存储在PROJECT_IS_TOP_LEVEL<PROJECT-NAME>_IS_TOP_LEVEL中。