一、整体构建流程概览

想象你要把一堆 .c 源代码变成一个可运行的程序(比如 myapp.exe 或 libmy.so),整个过程分为几个层次:

[源代码] 
   ↓
[CMake] → 生成构建脚本(如 Makefile / build.ninja)
   ↓
[Make 或 Ninja] → 读取构建脚本,调度编译任务
   ↓
[编译器(如 GCC/Clang)] → 实际编译代码(调用工具链)
   ↓
[可执行文件 / 库]

而 工具链(Toolchain) 是编译器及其配套工具的集合,决定了“为哪个平台编译”。

二、各组件详解

1、GCC(GNU Compiler Collection)—— 编译器(Compiler)
  • 作用:将 C/C++ 源代码翻译成机器码(目标文件 .o,最终链接成可执行文件或库)。
    包含工具:
  • gcc:C 编译器
  • g++:C++ 编译器
  • as:汇编器
  • ld:链接器
  • ar:静态库打包工具
gcc -c main.c        # 编译 → main.o
gcc main.o -o app    # 链接 → app

✅ 核心职责:真正执行编译动作。
🔸 类似工具:Clang(LLVM 项目)、MSVC(Visual Studio 的 cl.exe)

2、Make —— 构建系统(Build System)
  • 作用:根据 Makefile 中的规则,决定“哪些文件需要重新编译”、“按什么顺序编译”。
  • 特点:
  • 老牌、通用,几乎所有Unix/Linux 系统都自带
  • 依赖时间戳判断是否需要重编
  • 速度较慢(尤其大型项目)

Makefile 示例:

app: main.o utils.o
    gcc main.o utils.o -o app

main.o: main.c
    gcc -c main.c

命令:

make        # 执行构建
make clean  # 清理
3. Ninja —— 更快的构建系统
  • 作用:和 Make 类似,但设计目标是 极速构建。
  • 特点: 由 Google 开发,用于 Chromium、Android 等超大项目
  • 构建文件 build.ninja 通常由 CMake 生成(人不直接写)
  • 启动快、并行效率高
    命令:
ninja       # 构建
ninja -t clean  # 清理

核心职责:高速执行构建任务,替代 Make。

💡 Ninja 不会取代 GCC,它只是更高效地调用 GCC。

4. CMake —— 构建系统生成器(Build System Generator)
  • 作用:用统一的 CMakeLists.txt 描述项目,自动生成 Makefile、Ninja 文件、Visual Studio 工程等。
  • 为什么需要它?
  • 手写 Makefile 复杂且不可移植 CMake
  • 抽象了平台差异(Windows/Linux/macOS/Android)

工作流程:

cmake -G "Unix Makefiles" .   # 生成 Makefile
cmake -G "Ninja" .            # 生成 build.ninja
cmake -G "Visual Studio 17" . # 生成 .sln 工程

CMakeLists.txt 示例:

project(MyApp)
add_executable(app main.c)
5. 工具链(Toolchain)—— 目标平台的完整编译环境
  • 定义:一套用于为目标平台编译程序的工具集合。
  • 包含内容:
  • 编译器(如 arm-linux-gcc)
  • 链接器(如 ld)
  • 标准库(如 Android 的 libc)
  • 头文件(如 stdio.h 的目标平台版本)
  • 辅助工具(ar, strip, objcopy 等)

三、它们之间的关系(关键!)

CMake

生成

生成

Make

Ninja

使用

CMakeLists.txt

选择构建系统

Makefile

build.ninja

调用 GCC/Clang

工具链

目标平台可执行文件

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐