cmake-配置与基础

星之旷野,美梦犹存

Cmake

CMAKE 是一个开源的、跨平台的自动化构建系统。它的主要功能是帮助开发者管理软件项目的构建过程,无论项目在哪种操作系统上、使用哪种编译器。

Cmake并不直接生成编译代码,而是一个“项目配置生成器”。

安装CMAKE

首先我们在Cmake官网下载CMAKE构建工具:Download CMake

1750206854727

选择Windows x64 Installer 下载即可,下载完成后我们启动程序安装CMAKE。

安装完成后,在终端中输入:cmake --version

1750207100044

显示图中信息即为成功。

Ninja

Ninja 是一个小而快的构建系统,用于实际的构建项目,作用类似于链接器,但是ninja并不负责编译文件,实际负责编译的还是编译器gcc等。

安装Ninja

在github库的release中下载最新的对应版本的zip文件:Ninga

  • 创建目录: 在你电脑上选择一个合适的位置来存放 Ninja 可执行文件。建议选择一个简短、没有空格的路径,例如:
    C:\tools\ninja
  • 解压文件: 将下载的 ninja-win.zip 文件解压到你刚刚创建的目录中。解压后,你应该会在该目录下看到一个名为 ninja.exe 的文件。
  • 将 Ninja 添加到系统 PATH 环境变量

安装完成后在终端中输入 ninja --version

1750213335145

输出版本号即为安装成功。

使用Cmake和Ninja的构建流程

Cmake

  • CMake (设计师/项目经理): 你告诉设计师你需要一栋什么样的房子(你的项目),有多少房间(源文件),需要什么电器(外部库)。设计师(CMake)会根据这些需求,绘制出详细的 施工图纸 (生成 .ninja 文件)。这些图纸是针对特定施工队伍(比如使用 Ninja 的施工队)的。

Ninja

  • Ninja (施工队长/执行者): 施工队长(Ninja)拿到设计师的施工图纸后,不会自己去盖房子,而是会根据图纸, 高效地组织和指挥工人 。它会找出哪些工作可以同时进行(并行编译),哪些地方需要重新返工(增量构建),确保所有步骤都按图纸执行,并且速度最快。

GCC

  • GCC (工人/建造师): 工人(GCC)是实际动手盖房子的人。他们根据施工队长(Ninja)的指令,一块砖一块砖地砌墙,把水泥和钢筋变成结构(把源代码编译成机器码)。

在VScode中的实操

针对一个由C/C++语言完成的,由多个文件共同构成的,引入多个外部库的C项目来说,我们首先需要确保VScode中安装以下插件:

  1. C语言扩展包,一共包含三个扩展

1750213502974

  1. CMAKE语法支持

1750213596094

确保我们的系统环境中有:

  1. CMAKE
  2. Ninja
  3. GCC等c语言编译工具

接下来我们打开一个带有CMakeLists.txt 文件的C项目。

1750214027916

同时侧边工具栏会有出现一个CMAKE扩展的独有标志,低部会有通过cmake 快速构建,调试,启动项目的三个按钮。

通过vsc自动调用cmake构建的项目会在当前项目目录下创建一个build目录,并自动使用Ninja或make等工具,直接生成二进制可执行文件。

CMake 构建实例

项目结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
MyProject/
├── CMakeLists.txt
── src/
│ ├── main.cpp
│ ├── math/
│ │ ├── calculator.cpp
│ │ └── geometry.cpp
│ ├── utils/
│ │ ├── logger.cpp
│ │ └── file_helper.cpp
│ └── core/
│ ├── engine.cpp
│ └── config.cpp
├── include/
│ ├── math/
│ │ ├── calculator.h
│ │ └── geometry.h
│ ├── utils/
│ │ ├── logger.h
│ │ └── file_helper.h
│ └── core/
│ ├── engine.h
│ └── config.h
└── build/
  • main.cpp:主程序入口文件。
  • math/:数学计算相关模块
    • calculator.cpp/h:计算器功能实现。
    • geometry.cpp/h:几何计算功能。
  • utils/:工具类模块
    • logger.cpp/h:日志记录功能。
    • file_helper.cpp/h:文件操作辅助功能。
  • core/:核心功能模块
    • engine.cpp/h:核心引擎实现。
    • config.cpp/h:配置管理功能。
  • CMakeLists.txt:CMake 配置文件。

编写CMakeLists.txt文件

CMakeLists.txt文件用于配置CMake项目:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
cmake_minimum_required(VERSION 3.16)   # 指定最低 CMake 版本

project(MyProject VERSION 1.0 LANGUAGES CXX) # 定义项目名称、版本和语言

# 设置 C++ 标准为 C++17
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 添加头文件搜索路径
include_directories(${PROJECT_SOURCE_DIR}/include)

# 收集所有源文件
file(GLOB_RECURSE MATH_SOURCES "src/math/*.cpp")
file(GLOB_RECURSE UTILS_SOURCES "src/utils/*.cpp")
file(GLOB_RECURSE CORE_SOURCES "src/core/*.cpp")

# 创建数学计算库
add_library(MathLib ${MATH_SOURCES})
target_include_directories(MathLib PUBLIC ${PROJECT_SOURCE_DIR}/include)

# 创建工具库
add_library(UtilsLib ${UTILS_SOURCES})
target_include_directories(UtilsLib PUBLIC ${PROJECT_SOURCE_DIR}/include)

# 创建核心功能库
add_library(CoreLib ${CORE_SOURCES})
target_include_directories(CoreLib PUBLIC ${PROJECT_SOURCE_DIR}/include)
# 核心库依赖于工具库
target_link_libraries(CoreLib UtilsLib)

# 创建主可执行文件
add_executable(MyExecutable src/main.cpp)

# 链接所有库到可执行文件
target_link_libraries(MyExecutable
MathLib
UtilsLib
CoreLib
)

构建项目

为了保持源代码整洁,我们进入build目录进行构建。

1
2
3
cd build
cmake ..
cmake -G "Ninja" .. //指定生成器

编译项目

使用编译工具完成编译:

1
2
3
make
ninja
cmake --build . # 由cmake自己选择合适的工具编译

清理项目

1
2
make clean
ninja clean

cmake命令与build命令

这时我们需要思考一个关键的问题:什么时候需要执行一次 cmake命令,什么时候需要执行一次 cmake --build命令

cmake命令:

  1. 首次构建项目时
  2. 修改了CMakeLists.txt 文件时
    • 添加/删除源文件
    • 修改编译选项
    • 添加/删除依赖库
    • 修改项目配置
  3. 删除build目录后创建

cmake –build:

  1. 修改源代码文件内容时
  2. CMake配置已经完成,只需要编译时

总结:在我们创建了新的 .c文件时,或者我们修改了Cmake配置时,我们需要执行一次 cmake,其他时候只需要执行 cmake --build即可。

在实际使用时,一般先执行cmake --build 如果报错可以尝试执行一次cmake指令


cmake-配置与基础
http://blog.ulna520.com/2025/06/18/cmake-配置与基础_20250618_083114/
Veröffentlicht am
June 18, 2025
Urheberrechtshinweis