GCC入门指南
GCC(GNU Compiler Collection)是一套功能强大的编译器工具集,支持 C、C++、Objective-C 等多种编程语言,是 Linux 环境下开发的核心工具之一。掌握 GCC 命令的用法,能帮助你灵活控制编译过程(预处理、编译、汇编、链接),并生成可执行文件或库。
一、GCC 基本功能与编译流程
GCC 编译一个 C 程序的完整流程分为 4 个阶段,每个阶段可通过特定选项单独执行:
- 预处理(Preprocessing):处理宏定义(
#define)、头文件包含(#include)、条件编译(#ifdef)等,生成.i文件。 - 编译(Compilation):将预处理后的
.i文件转换为汇编代码(.s文件)。 - 汇编(Assembly):将汇编代码(
.s)转换为机器码(二进制目标文件.o)。 - 链接(Linking):将多个
.o目标文件及依赖的库文件组合,生成可执行文件或库。
二、GCC 常用命令格式
基本语法:
gcc [选项] 源文件/目标文件 [ -o 输出文件 ]
1. 直接生成可执行文件(全流程自动执行)
最常用的方式:一步完成预处理→编译→汇编→链接,生成可执行文件。
gcc main.c -o app # 将 main.c 编译为可执行文件 app(默认输出为 a.out)
-o 输出文件:指定生成的文件名(若省略,默认生成a.out)。
2. 分阶段执行(调试 / 分析用)
可通过选项单独执行某一阶段,方便查看中间结果:
- 预处理(只保留文本处理结果):
gcc -E main.c -o main.i # 生成预处理后的 .i 文件(保留宏展开、头文件内容等) - 编译(生成汇编代码):
gcc -S main.i -o main.s # 从 .i 生成汇编代码 .s
(也可直接用 .c 作为输入:gcc -S main.c)
- 汇编(生成目标文件):
gcc -c main.s -o main.o # 从 .s 生成二进制目标文件 .o
(也可直接用 .c 作为输入:gcc -c main.c)
- 链接(生成可执行文件):
gcc main.o tool.o -o app # 将多个 .o 目标文件链接为可执行文件 app
三、核心编译选项(高频使用)
1. 警告与错误处理
-Wall:开启大部分常用警告(如未使用变量、类型不匹配等),推荐始终添加,减少潜在错误。gcc -Wall main.c -o app # 编译时显示警告信息-Werror:将所有警告视为错误,强制修复警告才能编译通过(严格模式)。gcc -Wall -Werror main.c -o app # 警告即报错,无法生成可执行文件
2. 优化选项
通过优化编译生成的代码,提升运行效率(但可能增加编译时间):
-O0:无优化(默认,编译最快,适合调试)。-O1/-O2:基础优化(-O2优化更强,平衡效率和编译速度,常用)。-O3:极致优化(可能导致部分代码行为异常,谨慎使用)。-Os:优化代码大小(适合嵌入式设备)。gcc main.c -O2 -o app # 以 O2 级别优化编译
3. 调试选项
生成调试信息,配合 gdb 调试工具使用:
-g:生成基本调试信息(支持gdb断点、变量查看等)。-ggdb:生成更详细的gdb专用调试信息。gcc main.c -g -o app # 生成带调试信息的可执行文件,用于 gdb 调试
4. 头文件与库文件路径
-I<目录>:指定头文件(.h)的搜索路径(默认只搜索系统默认路径,如/usr/include)。bash
gcc main.c -I./include -o app # 从 ./include 目录查找头文件-L<目录>:指定库文件(.so动态库 /.a静态库)的搜索路径(默认搜索/usr/lib等)。-l<库名>:链接指定的库(库名省略前缀lib和后缀.so/.a)。bash
# 链接当前目录下的 libmath.a 静态库(或 libmath.so 动态库) gcc main.c -L. -lmath -o app
5. 宏定义
-D<宏名>:编译时定义一个宏(等效于代码中的#define 宏名)。-D<宏名>=<值>:定义带值的宏(等效于#define 宏名=值)。bash
# 定义 DEBUG 宏,代码中可通过 #ifdef DEBUG 启用调试逻辑 gcc main.c -DDEBUG -o app
6. 生成库文件
- 静态库(.a):编译时直接嵌入可执行文件,体积大但无需依赖外部文件。
gcc -c tool.c -o tool.o # 生成目标文件 ar rcs libtool.a tool.o # 将 tool.o 打包为静态库 libtool.a gcc main.c -L. -ltool -o app # 链接静态库生成可执行文件 - 动态库(.so):运行时加载,体积小但依赖库文件存在。
gcc -fPIC -c tool.c -o tool.o # -fPIC 生成位置无关代码(动态库必需) gcc -shared -o libtool.so tool.o # 生成动态库 libtool.so gcc main.c -L. -ltool -o app # 链接动态库生成可执行文件
四、实用示例
1. 多文件编译
项目包含 main.c、tool.c、tool.h,编译为可执行文件:
# 方式1:直接编译所有源文件
gcc main.c tool.c -Wall -o app
# 方式2:先编译为目标文件,再链接(适合多文件增量编译)
gcc -c main.c -Wall -o main.o
gcc -c tool.c -Wall -o tool.o
gcc main.o tool.o -o app
2. 链接数学库(libm.so)
数学函数(如 sin、sqrt)位于 libm.so 中,需用 -lm 链接:
gcc math_demo.c -lm -o math_app # 链接数学库
3. 交叉编译(针对其他平台)
如在 x86 电脑上编译 ARM 架构的程序(需安装交叉编译工具链,如 arm-linux-gnueabihf-gcc):
arm-linux-gnueabihf-gcc main.c -o app_arm # 生成 ARM 平台可执行文件
五、常用辅助命令
gcc --version:查看 GCC 版本。gcc -v:查看编译过程的详细信息(包括头文件 / 库的搜索路径)。file <可执行文件>:查看文件类型(如是否为 32/64 位、目标架构)。ldd <可执行文件>:查看动态库依赖(哪些.so文件会在运行时被加载)。
总结
GCC 命令的核心是通过选项控制编译流程和行为,常用场景包括:
- 基础编译:
gcc src.c -o out - 警告与调试:
-Wall -g - 头文件 / 库路径:
-I -L -l - 优化与宏定义:
-O2 -DDEBUG
结合 Makefile 使用时,这些选项通常会定义在 CFLAGS(编译选项)、LDFLAGS(链接选项)等变量中,实现自动化构建。

浙公网安备 33010602011771号