GCC 编译器使用与调试基础指南
简介
1984 年,Richard Stallman 发起自由软件运动,GNU 项目随之诞生。三年后,第一款可移植、支持 ANSI C 的开源 C 编译器——GCC(GNU Compiler Collection)问世。虽然最初名为 GNU C Compiler,但随着支持语言增多,现在通常指代整个编译工具集。
常用编译警告选项
开启警告是发现潜在问题的第一步。建议开发阶段始终加上 -Wall:
-Wall:显示所有常用的编译警告信息。-W:显示更多警告,如未使用变量或逻辑错误。-Wconversion:警告隐式类型转换。-Wshadow:警告影子变量(在作用域内重复声明已存在的变量)。-Wcast-qual:警告指针修改了变量的修饰符(例如指向 const 的指针被修改)。-Wwrite-strings:警告尝试修改 const 字符串。-Werror:将警告视为错误,即使只有警告也不编译。默认情况下 gcc 遇到警告仍会编译,除非显式指定此选项。
指定 C 语言标准
通过命令行选项控制 C 标准版本,从传统 C 到最新的 GNU 扩展:
-ansi:关闭 GNU 扩展中与 ANSI C 抵触的部分。-pedantic:关闭所有 GNU 扩展,严格遵循标准。-std=c89/-std=c99:分别遵循 C89 或 C99 标准。-std=traditional:使用原始 C。
注意:后四个选项可与 -ansi 结合使用,也可单独使用。默认情况下,gcc 使用最新的 GNU C 扩展。
编译过程与中间文件
以 hello.c 为例,gcc 执行流程如下:
- 预处理 (
hello.i):展开宏、包含头文件。 - 编译 (
hello.s):生成汇编代码。 - 汇编 (
hello.o):生成目标文件(机器码,但符号未解析)。 - 链接 (
hello或a.out):生成最终可执行文件。
若不通过 -o 指定文件名,默认生成 a.out。不指定文件名可能会覆盖上次的输出,建议养成指定习惯。
$ gcc hello.c
上述命令执行默认操作:源文件 -> 目标文件 -> 可执行文件 -> 删除目标文件。
若只生成目标文件:
$ gcc -Wall -c hello.c # 生成 hello.o
$ gcc -Wall -c -save-temps hello.c # 同时保留 .i, .s, .o
多文件编译与链接
当项目分布在多个文件中时(如 file1.c, file2.c):
$ gcc -Wall file1.c file2.c -o name
若仅修改其中一个文件,可只重新编译该文件再链接:
$ gcc -Wall -c file2.c
$ gcc file1.c file2.o -o name

