编译与构建
gcc/clang、Make、CMake。
35 分钟
编译与构建
C 项目常由多个 .c 文件组成,需要编译器与构建系统协调。对照 /roadmaps/c,本课介绍 gcc/clang、Make 与 CMake 的基本用法。
学习目标
- 理解编译、汇编、链接四阶段
- 用 gcc/clang 编译单文件与多文件项目
- 编写最小 Makefile
- 了解 CMake 在 C 项目中的角色
核心概念
编译流程与命令
源码 .c → 预处理 → 编译 → 汇编 → 目标文件 .o → 链接 → 可执行文件
# 单文件
gcc -std=c11 -Wall -Wextra -O2 main.c -o app
# 分步:生成目标文件再链接
gcc -std=c11 -Wall -c math.c -o math.o
gcc -std=c11 -Wall -c main.c -o main.o
gcc math.o main.o -o app
# 调试构建
gcc -std=c11 -g -O0 main.c -o app_debug
最小 Makefile
CC = gcc
CFLAGS = -std=c11 -Wall -Wextra -O2
TARGET = lesson_app
SRCS = main.c math.c
OBJS = $(SRCS:.c=.o)
$(TARGET): $(OBJS)
$(CC) $(OBJS) -o $(TARGET)
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(OBJS) $(TARGET)
.PHONY: clean
CMake 预览
cmake_minimum_required(VERSION 3.16)
project(LessonApp C)
set(CMAKE_C_STANDARD 11)
add_executable(lesson_app main.c math.c)
target_compile_options(lesson_app PRIVATE -Wall -Wextra)
cmake -S . -B build
cmake --build build
Java 一次 javac 得到字节码;C 需链接系统库(如 -lm 数学库)。
与 C++/Java 对照
| 角色 | C | C++ | Java |
|---|---|---|---|
| 编译器 | gcc、clang | 同左 + MSVC | javac |
| 构建描述 | Makefile / CMake | CMake 为主 | Maven / Gradle |
| 输出 | 原生二进制 | 原生二进制 | .class / .jar |
| 依赖管理 | 系统包 / 手动 | vcpkg / Conan | Maven Central |
| 链接 | 静态 / 动态库 | 同左 | 运行时 classpath |
C 与 C++ 共享 CMake 生态;大型 C 项目(Linux 内核除外)也常用 CMake 或 Make。
练习
- 将两个
.c文件编译为一个可执行文件 - 写 Makefile,支持 、