在 C++ 程序构建过程中,涉及 预处理 → 编译 → 汇编 → 链接 四个阶段,不同平台下背后调用的程序工具链略有不同。整理一份对比表,分别列出 Windows / macOS / Linux 主流环境下常见的工具:


📑 C++ 构建过程对应程序对比

阶段

Windows (MSVC)

Windows (MinGW/Clang)

macOS (Clang/LLVM)

Linux (GCC/Clang)

预处理 (Preprocessing) cl.exe /E

 (MSVC 内置预处理器)

cpp.exe

(GNU 预处理器) 或 clang -E

clang -E cpp

 或 gcc -E / clang -E

编译 (Compilation) cl.exe /c

(编译到汇编或目标文件 .obj

gcc -S

 / clang -S(生成 .s 汇编文件)

clang -S gcc -S

 / clang -S

汇编 (Assemble) ml.exe

(MASM, 针对汇编源码) 或 cl.exe 内置调用 c1.dll → c2.dll

as.exe

(GNU assembler)

as

(LLVM 调用系统 as,基于 Mach-O 格式)

as

(GNU assembler, 生成 ELF)

链接 (Linking) link.exe

(MSVC 链接器,生成 .exe/.dll

ld.exe

(GNU ld, PE 格式) 或 lld-link(LLVM 链接器)

ld64

(Apple 链接器,Mach-O 格式) 或 lld

ld

(GNU ld, ELF 格式) 或 lld


🔍 说明

  1. 1. Windows (MSVC 工具链)

    • • cl.exe:微软的 C/C++ 编译驱动程序,内部调用前端 (c1.dll)、优化器 (c2.dll) 和汇编器 → 产生 .obj

    • • link.exe:负责将 .obj 和 .lib 链接成 .exe 或 .dll

  2. 2. Windows (MinGW / LLVM Clang)

    • • MinGW 提供 GNU 工具链 (cppgccasld) 但目标是 PE/COFF 格式

    • • LLVM Clang 可以用 lld-link 替代 MSVC link.exe,兼容 MSVC 风格。

  3. 3. macOS (Clang + Apple 工具链)

    • • 默认编译器是 clang(Xcode/Command Line Tools 自带)。

    • • 汇编器调用系统的 as(Mach-O 格式)。

    • • 链接器是 ld64(Apple 专用,和 GNU ld 不完全兼容)。

  4. 4. Linux (GCC 或 Clang + GNU 工具链)

    • • GCC/Clang 前端调用 cpp 做预处理。

    • • as 是 GNU Assembler,输出 ELF 目标文件。

    • • 链接器 ld(GNU ld)或 lld(LLVM 链接器,速度更快)。


👉 总结一下:

  • • Windows:MSVC 自带一套 (cl.exe + link.exe),MinGW/Clang 用 GNU 工具链。

  • • macOS:Clang + Apple as + ld64

  • • Linux:GCC/Clang + GNU as + GNU ld

这里是 Windows / macOS / Linux 三个平台的 C++ 编译流程对照时序图

图片

  • • 横轴:从 源码 → 预处理 → 编译 → 汇编 → 链接 的阶段

  • • 纵轴:对应 不同平台的工具链

  • • 每个节点上方写了该平台在该阶段常用的程序/命令

这里是一个更简化的 “源码到可执行文件” 的对比图:

图片

  • • 横轴:从 源代码 (.cpp) 到 最终可执行文件

  • • 纵轴:不同平台的主工具链

  • • 只保留了关键入口命令(如 cl.exeg++clang++ 等)和最终链接器

这个图在简化的 “源码 → 可执行文件” 流程里,已经加上了 各平台的输出文件格式

图片

  • • Windows (MSVC / MinGW/Clang) → PE 格式 (.exe / .dll)

  • • macOS (Clang/LLVM) → Mach-O 格式 (binary / .dylib)

  • • Linux (GCC/Clang) → ELF 格式 (binary / .so)

好的 👍 我不能直接画图给你生成了,但我可以帮你整理一个 “完整流程增强版” ASCII/文本时序图,清晰展示各平台的 中间文件 (.i → .s → .o/.obj) 以及 最终产物格式


🛠️ C++ 跨平台编译完整流程对比图

┌───────────────────────┐
│   Source Code (.cpp)  │
└─────────┬─────────────┘
          │ Preprocessing
          ▼
   ┌───────────────────────┐
   │   Preprocessed (.i)   │
   └─────────┬─────────────┘
             │ Compilation
             ▼
      ┌───────────────────────┐
      │   Assembly (.s)       │
      └─────────┬─────────────┘
                │ Assembling
                ▼
         ┌───────────────────────┐
         │ Object File (.o/.obj) │
         └─────────┬─────────────┘
                   │ Linking
                   ▼
          ┌───────────────────────────────┐
          │   Executable / Library        │
          │   - Windows → PE  (.exe/.dll) │
          │   - macOS   → Mach-O (.bin/.dylib)│
          │   - Linux   → ELF  (.out/.so) │
          └───────────────────────────────┘

  • 预处理(Preprocessing):主要用于处理#开头的代码行,比如对宏做展开,对include的文件做展开,条件编译选项判断,清理注释等。文件以.i和.ii结尾。

  • 编译(Compilation):使用预处理的输出结果作为输入,生成文本格式的平台相关的汇编代码(assembly code)。文件以.s结尾。

  • 汇编(Assemble):将上一步的汇编代码转换成二进制的机器码,称为object code。产生的文件叫做目标文件,是二进制格式,文件以.o或.obj结尾。

  • 链接(Linking):链接过程将多个目标文以及所需的库文件(.so等)链接成最终的可执行文件(executable file)

图片

🔍 各平台工具链对应关系

阶段

Windows (MSVC)

Windows (MinGW/Clang)

macOS (Clang/LLVM)

Linux (GCC/Clang)

预处理 cl.exe /E cpp.exe

 / clang -E

clang -E cpp

 / gcc -E / clang -E

编译 cl.exe /c

 → .s

gcc -S

 / clang -S

clang -S gcc -S

 / clang -S

汇编

内部 (c1.dll → c2.dll) / ml.exe

as.exe as

 (Mach-O)

as

 (GNU, ELF)

目标文件 .obj

 (COFF)

.o

 (PE-COFF)

.o

 (Mach-O)

.o

 (ELF)

链接 link.exe ld.exe

 / lld-link

ld64 ld

 / lld

最终产物

PE → .exe / .dll

PE → .exe / .dll

Mach-O → binary / .dylib

ELF → binary / .so


  • • 中间文件 (.i, .s, .o/.obj) 在三个平台都有,只是格式不同。

  • • 最终可执行文件格式:Windows 是 PE,macOS 是 Mach-O,Linux 是 ELF

更多推荐