c++ 几个编译概念
- 一 概念
- 二 层级关系总结
- 2.1层级表格
- 2.2 关键点说明
- 2.3 示例流程(以 Ninja 为例)
- 2.4 示例流程(Windows 平台)
- 三 总结
一 概念
-
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.exeg++和clang++是底层编译器,直接处理代码生成目标文件。 - 这种分层设计实现了跨平台兼容性和构建效率优化。
实际上ninja 作为构建工具,可以支持msvc g++ clang++编译器的












![[免费]SpringBoot+Vue博物馆(预约)管理系统【论文+源码+SQL脚本】](https://i-blog.csdnimg.cn/direct/6e930f3dde3c4f2bb9cf4501c8642e1c.jpeg)






