在 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. Windows (MSVC 工具链)
-
•
cl.exe:微软的 C/C++ 编译驱动程序,内部调用前端 (c1.dll)、优化器 (c2.dll) 和汇编器 → 产生.obj。 -
•
link.exe:负责将.obj和.lib链接成.exe或.dll。
- 2. Windows (MinGW / LLVM Clang)
-
• MinGW 提供 GNU 工具链 (
cpp,gcc,as,ld) 但目标是 PE/COFF 格式。 -
• LLVM Clang 可以用
lld-link替代 MSVClink.exe,兼容 MSVC 风格。
- 3. macOS (Clang + Apple 工具链)
-
• 默认编译器是
clang(Xcode/Command Line Tools 自带)。 -
• 汇编器调用系统的
as(Mach-O 格式)。 -
• 链接器是
ld64(Apple 专用,和 GNU ld 不完全兼容)。
- 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+ GNUld。
这里是 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.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。