C++程序构建过程预处理→编译→汇编→链接四个阶段,Windows / macOS / Linux不同平台程序工具链对比

81 阅读4分钟

在 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.dllc2.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

  1. 2. Windows (MinGW / LLVM Clang)
  • • MinGW 提供 GNU 工具链 (cpp, gcc, as, ld) 但目标是 PE/COFF 格式

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

  1. 3. macOS (Clang + Apple 工具链)
  • • 默认编译器是 clang(Xcode/Command Line Tools 自带)。

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

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

  1. 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.exe, g++, 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.dllc2.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