构建工具知识地图
这张地图只关心一件事:一个 C/C++ 项目从源码变成可执行文件、库文件时,哪些工具各自负责什么。
一整套工具链
源码
-> 编译器/链接器
-> 构建规则
-> 构建后端/执行器
-> 第三方包管理
-> 产物
更贴近日常项目的写法是:
main.cpp / include/
-> g++ / clang++ / cl
-> Makefile / CMakeLists.txt / BUILD / SConstruct
-> make / ninja / bazel / scons / Visual Studio
-> vcpkg / Conan / apt / brew / 源码子模块
-> app.exe / libxxx.a / libxxx.so / xxx.dll
各工具出现在哪里
| 工具 | 定位 | 你直接写什么 | 你执行什么 |
|---|
| 编译器 | 真正编译和链接 C/C++ | .c、.cpp、头文件、编译参数 | g++ main.cpp -o app、clang++、cl |
| Makefile | 手写构建规则 | Makefile | make |
| CMake | 生成构建系统的配置工具 | CMakeLists.txt | cmake -S . -B build、cmake --build build |
| Ninja | 快速构建后端/执行器 | 通常不手写,读 build.ninja | ninja -C build |
| Bazel | 自带规则、依赖和缓存的构建系统 | WORKSPACE、BUILD | bazel build //... |
| SCons | Python 脚本式构建工具 | SConstruct | scons |
| 包管理器 | 获取和接入第三方库 | vcpkg.json、conanfile.txt 等 | vcpkg install、conan install |
常见组合
| 场景 | 常见组合 |
|---|
| 单文件练习 | g++ main.cpp -o app |
| 小型 C/C++ 项目 | Makefile + make |
| 跨平台开源项目 | CMake + Ninja/Make/Visual Studio |
| Windows + Visual Studio | CMake + Visual Studio Generator 或 .sln |
| 大型多语言仓库 | Bazel |
| 想用 Python 写构建逻辑 | SCons |
| 第三方 C++ 库较多 | CMake + vcpkg 或 CMake + Conan |
怎么选工具
| 你要什么 | 推荐 | 原因 |
|---|
| 快速编一个小程序 | 直接用编译器 | 命令最少 |
| 学会构建规则本质 | Makefile | target、dependency、recipe 很直观 |
| 做跨平台 C/C++ 项目 | CMake | 生态最常见,能生成多种后端 |
| CMake 构建速度更快 | Ninja | 适合作为 CMake 后端 |
| 巨型仓库、强缓存、可复现 | Bazel | 目标、依赖、缓存体系完整 |
| 构建规则需要大量脚本逻辑 | SCons | 用 Python 描述构建 |
| 管理第三方库 | vcpkg / Conan | 解决下载、编译、接入问题 |
自查表
注意事项
- 构建工具不是编译器。CMake、Make、Ninja、Bazel、SCons 最终还是会调用 GCC、Clang、MSVC 等编译器。
- Ninja 通常是后端,不负责发现源码、查找库、组织复杂项目。
- CMake 的
build 目录不是源码目录,它保存生成文件、缓存和中间产物。
- 包管理器解决“库从哪里来”和“怎么接入”,不替代构建系统。