C++ 的编译构建系统涵盖多个层次的工具组件,可以分为以下几类:

1 编译工具链(Toolchain)

工具链是指一整套将源代码转换为目标程序的工具组合,通常包括:

  • 编译器(compiler)
  • 汇编器(assembler)
  • 链接器(linker)
  • 运行库(runtime)

常见 C++ 工具链如下:

工具链组成特点平台支持
GNU Toolchaingcc, g++, as, ld, glibc老牌,跨平台广泛Linux, BSD, Windows(MinGW)等
LLVM Toolchainclang, lld, libc++, clang++模块化设计,前端先进Linux, macOS, Windows
MSVC Toolchaincl.exe, link.exe, nmake, MSVCRT微软自有闭源链Windows 专用
Intel Toolchainicx, dpcpp, xilink, libirc优化 for Intel 硬件多平台(收费)
Emscriptenemcc, wasm-ld, libc, wasm 运行时编译为 WebAssembly浏览器平台
ARM Toolchainarm-none-eabi-gcc, ld, newlib面向裸机嵌入式开发各类 ARM MCU 平台

🔍 注意:

  • MSVC 通常指整个 Visual Studio C++ 工具链,而真正的编译器程序是 cl.exe
  • GNU 和 LLVM 支持交叉构建,如 x86→ARM、Linux→Windows。

1.1 编译器前端(Compiler Frontend)

这些是将 C++ 源代码翻译为目标代码的前端程序:

编译器所属工具链特点
gcc, g++GNUC/C++ 前端,广泛使用
clang, clang++LLVM更好的诊断、模块化、更现代
cl.exeMSVC微软的 C/C++ 编译器
icx, dpcppIntel oneAPI高性能、支持 SYCL
emccEmscripten编译为 WebAssembly
arm-none-eabi-gccGNU面向 ARM 的交叉编译器

1.2 汇编器(Assembler)

作用:将 汇编语言代码(.s 或 .asm 文件)转换为 机器码目标文件(.o 或 .obj)。

典型流程:

int a = 1 + 2;

编译器将其转换为汇编代码(例如 x86):

mov eax, 1
add eax, 2

汇编器再将上面的指令转化为二进制形式,输出 .o.obj 文件。

常见工具:

工具所属工具链说明
asGNU BinutilsGNU 汇编器
ml.exe, ml64.exeMSVC微软汇编器(MASM)
llvm-asLLVMLLVM 汇编器(IR 汇编)

是否可直接写汇编?

可以。但现代编译器通常会自动生成汇编代码。直接手写汇编用于系统底层开发(如启动代码、嵌入式、优化等)。


1.3 链接器(Linker)

作用:将多个目标文件(.o, .obj)和库(.lib, .a, .dll, .so)链接为一个可执行文件动态/静态库

典型流程:

  • main.olibmath.a 合并
  • 解析符号(函数、变量定义/引用)
  • 生成 .exe, .out, .dll, .so, .dylib 等文件

常见工具:

工具所属工具链说明
ldGNU经典 ELF 链接器
ld.goldGNU更快的 GNU 链接器
lldLLVMLLVM 链接器,支持多平台
link.exeMSVC微软 Windows PE 格式链接器
title: 相关概念
 
- **符号解析**:链接器查找函数/变量的实现
- **重定位(relocation)**:处理不同模块之间的地址关系
- **静态链接 vs 动态链接**:
    - 静态:打包进最终文件
    - 动态:运行时加载共享库

1.4 运行库(Runtime Library)

作用: 程序在运行时依赖的一组库,提供如内存管理、异常处理、I/O、C++ 标准库等支持。

分类:

  1. C 标准运行库
  • libc, msvcrt.dll:提供如 printf, malloc
  1. C++ 标准库实现
  • libstdc++:GNU 的 C++ 标准库(用于 GCC)
  • libc++:LLVM 的 C++ 标准库(用于 Clang)
  • MSVCP*.dll:微软的 C++ 运行库(用于 MSVC)
  1. 其他运行时支持
  • 异常处理支持(SEH、DWARF)
  • 线程模型(POSIX threads, Windows threads)
  • 启动代码(CRT startup)

编译器相关选项:

编译器控制 runtime 方式说明
MSVC/MD, /MT, /MDd, /MTd动态/静态链接 CRT(release/debug)
GCC/Clang-static, -shared, -lstdc++, -lc控制静态链接与运行库选择

1.5 总结图:C++ 构建流程关键工具链组件

源码 .cpp
   ↓
[编译器 frontend]
   → 生成汇编 .s
   ↓
[汇编器 assembler]
   → 生成目标文件 .o/.obj
   ↓
[链接器 linker]
   → 解析依赖 + 标准库 + 运行库
   ↓
生成可执行文件 .exe / .out / .dll / .so

运行时:
  ↳ 依赖运行库(libc++, msvcrt, libc, libstdc++)

2 构建系统(Build Systems)

作用: 管理项目源文件、依赖关系、构建目标、执行构建流程(编译/链接)。

典型流程:

  • 读取构建配置(如 CMakeLists.txt
  • 生成构建指令(Makefile/Ninja/VS 工程)
  • 调用编译器、链接器构建目标文件

常见工具:

工具特点支持平台
CMake元构建系统,生成 make/ninja/VS 等跨平台
Make传统构建工具Unix-like
Ninja快速构建,CMake 支持输出跨平台
MSBuild微软 Visual Studio 构建工具Windows
BazelGoogle 推出的现代构建系统跨平台
SConsPython 脚本化构建跨平台

3 包管理器与依赖工具

用于下载、构建和管理第三方 C++ 库:

工具说明
vcpkg微软主导,基于 triplet 管理构建(配合 MSVC/CMake)
Conan跨平台支持多工具链,profile 灵活,可生成 toolchain
Hunter基于 CMake 的包管理工具
SpackHPC 社区常用,依赖强版本控制与模块化

4 测试与打包工具

工具作用
CTestCMake 自带测试工具
GoogleTest主流 C++ 单元测试库
Catch2轻量级测试框架
CPackCMake 打包工具,可导出安装包

5 IDE 与辅助工具

工具说明
Visual Studio / VSCode主流 IDE,分别适用于大型和轻量项目
CLionJetBrains 的跨平台 C++ IDE,集成 CMake 和 vcpkg
clangd / ccls / intellisense语言服务器,用于代码补全、诊断等
lldb / gdb / windbg调试器,分别对应 Apple/Linux/Windows 平台

6 附:工具之间的关系图(简化)

源代码 (.cpp/.c)

[编译器前端: g++, clang++, cl.exe]
   ↓  生成汇编 (.s/.asm)
[汇编器: as, ml.exe, llvm-as]
   ↓  生成目标文件 (.o/.obj)
[链接器: ld, lld, link.exe]  ←── 静态库 (.a/.lib)、动态库 (.so/.dll)

目标程序 (.exe/.out/.wasm/.so/.dll)

运行时依赖: libc, libstdc++/libc++, msvcrt
 
       ┌──────────────┐     ┌──────────────┐
       │  构建系统      │     │  包管理器      │
       │ CMake, Make,  │────→│ vcpkg, Conan, │
       │ Ninja, Bazel  │     │ Hunter, Spack │
       └──────┬───────┘     └──────────────┘

       ┌──────┴───────┐
       │ 测试与打包     │
       │ CTest, CPack, │
       │ GoogleTest    │
       └──────────────┘