编译过程(直觉版)
你写的是文本,CPU 执行的是机器码。中间有一条流水线。初学不必背每个细节,但要能对常见报错「对号入座」。
1. 概念:流水线三段
- 预处理:处理 #include、#define、#ifdef,展开成更大的 .i 文件
- 编译:语法检查、优化,生成汇编/目标文件(.o / .obj)
- 链接:把多个目标文件和库拼成可执行文件
2. 实际命令例子
C
| 1 | gcc hello.c -o hello # 一步到位 |
| 2 | gcc -c hello.c -o hello.o # 只编译不链接 |
| 3 | gcc hello.o -o hello # 链接 |
| 4 | gcc -Wall hello.c -o hello # 打开常见警告(推荐) |
3. 报错类型地图
| 阶段 | 典型报错关键词 | 你该查什么 |
|---|
| 预处理 | missing file | 头文件路径/拼写 |
| 编译 | syntax error / expected | 语法、分号、括号 |
| 链接 | undefined reference | 函数没实现或没链库 |
| 链接 | duplicate symbol | 重复定义全局函数/变量 |
4. 预处理示意
C
| 1 | #define N 3 |
| 2 | #include <stdio.h> |
| 3 | |
| 4 | int main(void) { |
| 5 | printf("%d\n", N); // 预处理后 N 会被换成 3 |
| 6 | return 0; |
| 7 | } |
可以试试 gcc -E hello.c 只看预处理结果(输出很长,了解即可)。