CMake / Make / Ninja / MSVC / GCC / Clang / MSBuild —— 完整体系化理解

一句话核心:

CMake 生成构建系统,Make/Ninja/MSBuild 执行构建,MSVC/GCC/Clang 才是真正编译器。

你可以把整个体系理解成一个建筑工地:

  • CMake = 工头(制定施工计划)
  • Make / Ninja / MSBuild = 工人(执行计划)
  • MSVC / GCC / Clang = 工具(锤子、电钻)

1. 构建体系的角色定位

1.1 CMake ------ 元构建工具(构建系统生成器)

CMake 的本质:

  • 不会编译代码
  • 不会链接代码
  • 只负责生成构建系统

它根据 CMakeLists.txt 生成:

  • Makefile(给 make)
  • build.ninja(给 ninja)
  • .sln(给 Visual Studio / MSBuild)
  • .xcodeproj(给 Xcode)

CMake 的输出取决于你选择的 generator。


1.2 Make ------ 传统构建工具

Make 的特点:

  • 根据 Makefile 执行编译命令
  • 语法古老但兼容性强
  • 并行能力一般(make -j)
  • 常用于 Linux / Unix

1.3 Ninja ------ 现代高速构建工具

Ninja 的特点:

  • 极快(为 Chrome/Android 设计)
  • 并行能力强
  • 输出简洁
  • 不适合手写,通常由 CMake 生成

构建脚本:build.ninja


1.4 MSVC ------ Windows 官方 C/C++ 编译器

MSVC 包含:

  • 编译器:cl.exe
  • 链接器:link.exe
  • 调试符号:PDB
  • Windows SDK / CRT

负责:

  • .cpp → .obj
  • .obj → .exe / .dll

1.5 GCC ------ Linux 世界最常用的编译器

GCC 的特点:

  • Linux 默认编译器
  • 稳定、兼容性强
  • 支持多语言(C/C++/Fortran 等)

1.6 Clang ------ 现代编译器(LLVM)

Clang 的特点:

  • 编译速度快
  • 错误信息友好
  • 跨平台(Windows / Linux / macOS)
  • 可替代 GCC 或 MSVC(通过 clang-cl)

1.7 MSBuild ------ Visual Studio 的构建系统

MSBuild 是:

  • Visual Studio 的官方构建系统
  • 解析 .sln / .vcxproj
  • 调用 MSVC 编译器

Visual Studio 内部不使用 Make 或 Ninja,只使用 MSBuild。


2. 它们之间的关系(图景理解)

复制代码
你写的代码 + CMakeLists.txt
                │
                ▼
          CMake(生成器)
                │
 ┌──────────────┼────────────────┬──────────────────┐
 ▼              ▼                ▼                  ▼
Makefile     build.ninja       .sln             Xcode 工程
(给 make)   (给 ninja)   (给 MSBuild)      (给 xcodebuild)
   │              │                │                  │
   ▼              ▼                ▼                  ▼
 make          ninja           MSBuild             xcodebuild
   │              │                │                  │
   ▼              ▼                ▼                  ▼
编译器(gcc / clang / cl.exe / clang-cl)

真正编译代码的是编译器,而不是 CMake / Make / Ninja / MSBuild。


3. CMake 的工作原理

CMake 有两个阶段:

3.1 配置阶段(Configure)

解析:

  • CMakeLists.txt
  • 依赖
  • 目标(target)
  • 编译选项
  • 平台信息

生成缓存文件:

复制代码
CMakeCache.txt

3.2 生成阶段(Generate)

根据 generator 生成:

  • Makefile
  • build.ninja
  • .sln
  • Xcode 工程

CMake 本身不参与编译,只负责生成构建系统。


4. Make / Ninja / MSBuild 对比(构建工具层)

特性 Make Ninja MSBuild
平台 Linux 跨平台 Windows
速度 慢 极快 中等
并行能力 一般 强 中等
输出 杂乱 简洁 冗长
适合大型项目 一般 非常适合 一般
CMake 支持 好 最好 好
IDE 支持 弱 弱 Visual Studio 原生

VSCode 推荐 Ninja,Visual Studio 必须用 MSBuild。


5. 编译器层:MSVC / GCC / Clang 对比

特性 MSVC GCC Clang
平台 Windows Linux 跨平台
标准支持 好 好 最好
错误信息 一般 一般 最友好
兼容性 Windows 最佳 Linux 最佳 跨平台最佳
调试符号 PDB DWARF DWARF / PDB

Clang 是最现代的编译器,MSVC 是 Windows 最强,GCC 是 Linux 默认。


6. 构建工具与编译器的组合

构建工具 可调用的编译器
Make GCC / Clang
Ninja GCC / Clang / MSVC / clang-cl
MSBuild MSVC(只能 MSVC)

Ninja 是唯一能在所有平台调用所有编译器的构建工具。


7. VSCode + CMake + Ninja + MSVC(最佳实践)

流程:

复制代码
CMakeLists.txt
    ↓
cmake --preset debug
    ↓
生成 build.ninja
    ↓
ninja -C build/debug
    ↓
cl.exe 编译
    ↓
cppvsdbg 调试

这是 Windows + VSCode 下最现代、最快速的 C++ 构建体系。


8. Visual Studio 的构建流程(MSBuild)

复制代码
.sln / .vcxproj
    ↓
MSBuild
    ↓
cl.exe / link.exe
    ↓
exe / dll

Visual Studio 不使用 Ninja 或 Make。


9. 跨平台构建体系推荐

平台 构建工具 编译器
Windows Ninja MSVC / clang-cl
Linux Ninja / Make GCC / Clang
macOS Ninja / Xcode Clang

CMake + Ninja 是跨平台最统一的选择。


10. 最终总结

  • CMake 是指挥者
  • Make/Ninja/MSBuild 是执行者
  • MSVC/GCC/Clang 是工具
  • CMake 生成构建系统,构建工具执行构建,编译器真正编译代码
  • VSCode 最佳组合:CMake + Ninja + MSVC
  • Visual Studio 必须使用 MSBuild

相关推荐
所以遗憾是什么呢?9 小时前
【题解】Educational Codeforces Round 195 (Rated for Div. 2) ABCDE
c++·动态规划·acm·icpc·ccpc·xcpc·codeforecs
Lhan.zzZ11 小时前
Qt WebEngineView 在 Linux 上无法加载网页:从“看不见 HTML“到“禁用沙箱“
linux·c++·qt
sysu_chenxy12 小时前
二重循环输出二维图形
c++
划破黑暗的第一缕曙光14 小时前
[C++]:2.类和对象(下)
c++·类和对象·对象·类
黎相思15 小时前
LRU Cache
c++·缓存
UIU11415 小时前
P1003 [NOIP 2011 提高组] 铺地毯
数据结构·c++·算法
xxwl58517 小时前
区域赛算法模版第四章---数据结构
数据结构·c++·算法
余额瞒着我当琳18 小时前
哈希表底层原理解析,直接定址法,哈希冲突,负载因子,哈希函数,开放定址法
java·c++·哈希算法·散列表
xxwl58518 小时前
区域赛算法模版第五章---数学与数论
c++·笔记·算法
局部有解19 小时前
LeetCode Hot100 438 找到字符串中所有字母异位词
c++·算法·leetcode