【Linux】编译相关
🔸 类似工具:Clang(LLVM 项目)、MSVC(Visual Studio 的 cl.exe)而 工具链(Toolchain) 是编译器及其配套工具的集合,决定了“为哪个平台编译”。💡 Ninja 不会取代 GCC,它只是更高效地调用 GCC。核心职责:高速执行构建任务,替代 Make。✅ 核心职责:真正执行编译动作。调用 GCC/Clang。
·
一、整体构建流程概览
想象你要把一堆 .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 等)
三、它们之间的关系(关键!)
更多推荐


所有评论(0)