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

相关推荐
倒头就睡的小比特3 天前
算法竞赛C++常用的STL
c++·算法
weilx12343 天前
C++笔记-文件IO-<fcntl.h>
c++
Smileyqp沛沛3 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
吞下星星的少年·-·3 天前
C++ 萌新语法入门篇
c++·算法比赛
霍霍的袁3 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
another heaven3 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
程序猿编码3 天前
告别改源码适配模型:纯 C++ 可配置 LLM 推理引擎,全格式全结构兼容
c++·大模型·llm·推理引擎
此生决int3 天前
深入理解C++系列(20)——C++11(下)
开发语言·c++