构建工具知识地图

这张地图只关心一件事:一个 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 appclang++cl
Makefile手写构建规则Makefilemake
CMake生成构建系统的配置工具CMakeLists.txtcmake -S . -B buildcmake --build build
Ninja快速构建后端/执行器通常不手写,读 build.ninjaninja -C build
Bazel自带规则、依赖和缓存的构建系统WORKSPACEBUILDbazel build //...
SConsPython 脚本式构建工具SConstructscons
包管理器获取和接入第三方库vcpkg.jsonconanfile.txtvcpkg installconan install

常见组合

场景常见组合
单文件练习g++ main.cpp -o app
小型 C/C++ 项目Makefile + make
跨平台开源项目CMake + Ninja/Make/Visual Studio
Windows + Visual StudioCMake + Visual Studio Generator.sln
大型多语言仓库Bazel
想用 Python 写构建逻辑SCons
第三方 C++ 库较多CMake + vcpkgCMake + Conan

怎么选工具

你要什么推荐原因
快速编一个小程序直接用编译器命令最少
学会构建规则本质Makefiletarget、dependency、recipe 很直观
做跨平台 C/C++ 项目CMake生态最常见,能生成多种后端
CMake 构建速度更快Ninja适合作为 CMake 后端
巨型仓库、强缓存、可复现Bazel目标、依赖、缓存体系完整
构建规则需要大量脚本逻辑SCons用 Python 描述构建
管理第三方库vcpkg / Conan解决下载、编译、接入问题

自查表

问题应该先看
编译命令不会写编译器与工具链
Makefile 规则看不懂Makefile
CMake 和 Ninja 关系不清楚CMake工具链定位Ninja
不知道选 Bazel 还是 CMakeBazel构建工具知识地图
想用 Python 写构建脚本SCons
第三方库接入失败C和C++第三方包管理

注意事项

  • 构建工具不是编译器。CMake、Make、Ninja、Bazel、SCons 最终还是会调用 GCC、Clang、MSVC 等编译器。
  • Ninja 通常是后端,不负责发现源码、查找库、组织复杂项目。
  • CMake 的 build 目录不是源码目录,它保存生成文件、缓存和中间产物。
  • 包管理器解决“库从哪里来”和“怎么接入”,不替代构建系统。