GCC 和 G++ 是 GNU 编译器集合中的核心工具,分别用于编译 C 和 C++ 程序。程序的翻译过程经历四个阶段:预处理、编译、汇编和链接。
一、编译流程详解
-
预处理(Preprocessing)
- 命令:
gcc -E code.c -o code.i - 功能:进行宏替换、去注释、条件编译、头文件展开等。
- 结果:生成
.i文件,内容通常比源文件大很多(如 24 行源码展开为 800 多行)。
- 命令:
-
编译(Compilation)
- 命令:
gcc -S code.i -o code.s - 功能:将预处理后的代码转换为汇编语言。
- 结果:生成
.s文件。
- 命令:
-
汇编(Assembly)
- 命令:
gcc -c code.s -o code.o - 功能:将汇编代码转换为机器可识别的目标代码。
- 结果:生成
.o目标文件,不可直接执行,但可重定位。
- 命令:
-
链接(Linking)
- 命令:
gcc code.o -o mycode - 功能:将目标文件与库文件链接,生成可执行文件。
- 结果:生成可执行文件
mycode。
- 命令:
记忆口诀:使用 -E、-S、-c 选项可分别停留在上述三个阶段。
二、静态库与动态库
1. 库文件类型
- Linux 动态库:后缀
.so(如libXXX.so)。 - Linux 静态库:后缀
.a(如libXXX.a)。 - Windows 动态库:后缀
.dll。 - Windows 静态库:后缀
.lib。
2. 创建与管理
- 静态库:
gcc -c file1.c file2.c ar rcs libmylib.a file1.o file2.o - 动态库:
gcc -fPIC -c file1.c file2.c gcc -shared -o libmylib.so file1.o file2.o
3. 链接方式对比
| 特性 | 静态链接 | 动态链接 |
|---|---|---|
| 文件大小 | 较大(库代码嵌入) | 较小(仅存地址信息) |
| 依赖关系 | 无外部依赖,独立运行 | 依赖运行时库文件 |


