一 概念
-
CMake 通过
CMakeLists.txt
生成不同平台的构建文件(如.sln
、build.ninja
、Makefile
),这些文件属于构建规则描述层,负责定义如何组织编译流程。 -
调度器(如
MSBuild
、Ninja
、Make
)负责解析这些构建文件,调度编译任务。它们属于构建执行层,决定哪些文件需要重新编译以及如何并行执行任务。 -
编译器(如
MSVC
、g++
、clang++
)是实际执行编译的工具,属于底层实现层。它们直接处理源代码,生成目标文件(.o
)或可执行文件(.exe
)。
二 层级关系总结
2.1层级表格
层级 | 工具/文件 | 作用 | 引用来源 |
---|---|---|---|
规则生成层 | CMake、CMakeLists.txt | 跨平台生成构建规则文件 | |
调度执行层 | MSBuild、Ninja、Make | 解析构建文件,调度编译任务 | |
底层实现层 | MSVC、g++、clang++ | 实际编译源代码,生成可执行文件或库 |
2.2 关键点说明
-
CMake 的定位:
CMake 是跨平台抽象层,通过生成适配不同平台的构建文件,屏蔽底层工具链差异。 -
调度器的依赖:
MSBuild
依赖.sln
/.vcxproj
文件(由 CMake 生成),调用MSVC
编译器。Ninja
依赖build.ninja
文件,调用g++
或clang++
。Make
依赖Makefile
,调用g++
或clang++
。
-
编译器的位置:
g++
和clang++
是直接处理代码的最底层工具,它们不依赖其他编译器,仅根据调度器(如Ninja
)的指令完成编译任务。
2.3 示例流程(以 Ninja 为例)
- CMake 生成
build.ninja
文件,定义编译规则(如g++ -c main.cpp -o main.o
)。 Ninja
读取build.ninja
,发现main.o
需要重新编译。Ninja
调用g++
执行编译命令,生成main.o
。- 最终链接生成可执行文件。
2.4 示例流程(Windows 平台)
- CMake 生成 .sln 和 .vcxproj 文件
在项目根目录执行以下命令,生成 Visual Studio 解决方案文件和项目文件:(生成器为 Visual Studio 2022)
cmake -G "Visual Studio 17 2022" ..
- MSBuild 调用 .sln 文件
使用 MSBuild 编译解决方案文件(.sln),触发 .vcxproj 中定义的编译任务: - MSVC 编译源文件生成 .obj
MSBuild 调用 MSVC 编译器(cl.exe)逐个编译 .cpp 文件,生成对应的 .obj 目标文件:
/c:仅编译不链接。
/Fo:指定输出文件名
bash
cl.exe /c main.cpp /Fo main.obj
- 链接 .obj 生成可执行文件(.exe)
MSBuild 调用 MSVC 链接器(link.exe)将所有 .obj 文件和依赖库链接为最终可执行文件:exe
三 总结
- (上)**CMake 是跨平台生成 **“构建文件”**的工具,生成(build.ninja等)
- (中)Ninja MsBuild Make是构建工具使用文件build.ninja/sln+vcproject/makefile,负责执行生成规则和调度任务。
- (下)
cl.exe
g++
和clang++
是底层编译器,直接处理代码生成目标文件。 - 这种分层设计实现了跨平台兼容性和构建效率优化。
实际上ninja 作为构建工具,可以支持msvc g++ clang++编译器的