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

相关推荐
Peter·Pan爱编程2 小时前
10. new_delete 不是 malloc_free 的包装
c++·人工智能·算法
故事和你913 小时前
洛谷-【动态规划1】动态规划的引入2
开发语言·数据结构·c++·算法·动态规划·图论
fpcc4 小时前
c++编程实践——历史记录的管理
c++
玖笙&5 小时前
✨WPF编程基础【3.3】:容器控件(附源码)
c++·wpf·visual studio
汉克老师5 小时前
GESP5级C++考试语法知识(十七、二分算法提高篇(二))
c++·算法·二分算法·gesp5级·gesp五级·二分算法易错点
我材不敲代码6 小时前
Python 正则表达式进阶实战:从文本清洗到复杂信息提取
c++·python·正则表达式
我命由我123456 小时前
Android Framework P3 - MediaServer 进程、认识 ServiceManager 进程
android·c语言·开发语言·c++·visualstudio·visual studio·android runtime
计算机安禾6 小时前
【c++面向对象编程】第48篇:Lambda表达式与std::function:OOP中的函数式编程
java·c++·算法
chxin140166 小时前
CMake 笔记
c++