C++程序构建过程预处理→编译→汇编→链接四个阶段,Windows / macOS / Linux不同平台程序工具链对比
在 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 |
cpp
或 |
| 编译 (Compilation) | cl.exe /c
(编译到汇编或目标文件 |
gcc -S
/ |
clang -S |
gcc -S
/ |
| 汇编 (Assemble) | ml.exe
(MASM, 针对汇编源码) 或 |
as.exe
(GNU assembler) |
as
(LLVM 调用系统 |
as
(GNU assembler, 生成 ELF) |
| 链接 (Linking) | link.exe
(MSVC 链接器,生成 |
ld.exe
(GNU ld, PE 格式) 或 |
ld64
(Apple 链接器,Mach-O 格式) 或 |
ld
(GNU ld, ELF 格式) 或 |
🔍 说明
-
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 |
cpp
/ |
| 编译 | cl.exe /c
→ |
gcc -S
/ |
clang -S |
gcc -S
/ |
| 汇编 |
内部 ( |
as.exe |
as
(Mach-O) |
as
(GNU, ELF) |
| 目标文件 | .obj
(COFF) |
.o
(PE-COFF) |
.o
(Mach-O) |
.o
(ELF) |
| 链接 | link.exe |
ld.exe
/ |
ld64 |
ld
/ |
| 最终产物 |
PE → |
PE → |
Mach-O → binary / |
ELF → binary / |
-
• 中间文件 (.i, .s, .o/.obj) 在三个平台都有,只是格式不同。
-
• 最终可执行文件格式:Windows 是 PE,macOS 是 Mach-O,Linux 是 ELF。
更多推荐

所有评论(0)