工具
make https://www.gnu.org/software/make/
cmake
ninja
底层构建引擎(Build Engines)
这类工具是真正的“干活者”,它们直接读取规则文件(如 Makefile),解析依赖关系,并调用编译器(GCC、Clang、MSVC)将源码编译成目标文件。
GNU Make
- 控制文件:
Makefile - 特点: 最经典、最古老的构建工具。几乎存在于所有的类 Unix 系统中。
- 现状: 手写复杂的 Makefile 在现代大中型项目中已经很少见(维护成本极高),但它依然是小型单体项目或嵌入式开发的首选。
Ninja
- 控制文件:
build.ninja - 特点: 专为速度而生的构建引擎。
- 现状: 它的配置文件设计得非常低级(类似汇编语言),不推荐人类手写。通常由 CMake 或 Meson 自动生成。在大型项目(如 Chromium、LLVM)中,Ninja 比 Make 能显著缩短增量编译的等待时间。
元构建系统 (Meta-Build Systems)
这类工具本身不直接调用编译器,而是根据高阶配置文件,生成底层构建引擎所需的输入文件(如 Makefile 或 build.ninja)。它们解决了跨平台配置的痛点。
CMake (绝对的行业事实标准)
- 地位: 目前 C/C++ 领域无可争议的统治者。几乎所有主流 IDE(VS Code、CLions、Visual Studio)都对其提供了原生或一流的插件支持。
- 语法: 独创的 CMake 脚本语言,语法较为晦涩、历史包袱重,常被开发者吐槽“难写难读”。
- 优点:
- 生态极度强大,绝大多数开源 C/C++ 库都原生支持 CMake。
- 跨平台支持极佳,能生成 Makefile、Ninja、MSBuild (VS Solution)、Xcode Project 等。
适用场景: 绝大多数中大型项目、开源项目、跨平台项目。
三、 特殊与大型生态构建工具
1. Bazel (Google 体系 / 巨型项目)
- 特点: 专为超大型、多语言混合的 Monorepo(单体大仓库)设计。
- 优点: 拥有极致的缓存机制(增量编译极快)和分布式构建能力,确保构建结果的绝对一致性(Deterministic)。
- 缺点: 配置极其繁琐,学习曲线高,轻量级项目用它属于“杀鸡用牛刀”。
2. Autotools (已经步入历史的经典)
- 代表流程:
./configure && make && make install - 现状: 曾经是 Unix/Linux 开源软件的标配。由于配置极其复杂(涉及 M4 宏、Shell 脚本),且对 Windows 支持极差,目前新项目基本不再采用,但在维护老旧的开源 Linux 库时仍会遇到
四、 辅助角色:C/C++ 包管理器
构建 C/C++ 项目时,第三方库的引入一直是个痛点。现代构建通常会结合包管理器使用:
- Conan: 功能最强大、最通用的 C/C++ 跨平台包管理器,通常与 CMake 深度集成。
- vcpkg: 微软主导的开源包管理器,对 Windows/MSVC 支持极佳,目前对 macOS/Linux 的支持也已经非常成熟,与 CMake 配合天衣无缝。
include 其他的文件
include库文件,查找路径
gcc 编译文件所有的.c文件,头文件可有可无。如果实现部分也写到头文件中,
.h.gch文件是什么?
macOS Linux下用VSCode环境搭建
sudo apt-get install build-essential gdb cmake
编译过程:
- 预处理 .i文件
- 编译 .s文件
- 汇编 .o文件
- 链接 可执行文件

常用命令
cc
gcc
g++
clang
clang++
gdb
Debugger
IDE
- Xcode
- Visual Studio
- CLion
- VSCode
- Eclipse
- ...
Build System
- Make
- Ninja
- ...
Build System Generator
- GYP
- GN
- CMake
- Meson
很多地方都看到了python的影子,比如Meson,gyp,ninja。
相较于其他的脚本语言,python应用更加广泛;
而 node.js应用于前端的工具链,ruby在iOS开发工具中更为常见,比如Homebrew, cocoapods, fastlane等
pkg-config
pkg-config 是一个在源代码编译时查询已安装的库的使用接口的计算机工具软件
它输出已安装的库的相关信息,包括:
- C/C++编译器需要的输入参数
- 链接器需要的输入 参数
- 已安装软件包的版本信息
- https://freedesktop.org/wiki/Software/pkg-config/
make & cmake
简介明了的makefile教程 ++https://www.bilibili.com/video/BV1na4y1H7Bp++
编译器
编译器Compiler
gcc, llvm
GCC
选项
-I 编译时选项CFLAGS,指定头文件包含的目录 -Iinclude -I/usr/include/xxxx
-l 链接时选项LFLAGS
-L LIBS,/usr/lib/xxxx/
-c Only run preprocess, compile, and assemble steps
-g 产生带调试信息的可执行文件
-O[n] 优化源代码,n表示优化级别
-Wall 打开警告信息
-w关闭警告信息
-std=c89
-o指定输出文件名
-D定义宏 -DTEST -DDEBUG等
生成静态库文件
# 在src目录下
$ cc -c swap.c -I../include # 生成swap.o文件
# 归档成静态库
$ ar rs libswap.a swap.o
# 使用静态库,在外层目录
$ cc main.c -lswap -Lsrc -Iinclude
生成动态库
# 生成动态库
$ cc swap.c -I..include -fPIC -shared -o libswap.so
# 使用动态库
$ cc main.c -lswap -Lsrc -Iinclude
# 运行时 报错解决
$ LD_LIBRARY_PATH=src ./a.out
LLVM

调试器
GDB调试器
在macOS上使用gdb调试需要签名
VSCode 中报错:Debugger executable '/usr/local/bin/gdb' is not signed. As a result, debugging may not work properly.
命令行调试时错误:
Unable to find Mach task port for process-id 81839: (os/kern) failure (0x5).
(please check gdb is codesigned - see taskgated(8))
可能的解决方案:https://dev.to/jasonelwood/setup-gdb-on-macos-in-2020-489k