GCC编译器的使用
GCC(GNU Compiler Collection)是 Linux 下最核心的编译工具链,支持 C、C++、Objective-C、Fortran 等多种语言,是开发和运维中编译程序、排查编译问题的必备工具。
1.1、核心基础
- 核心组件
- 预处理器(cpp):处理宏定义、头文件包含等;
- 编译器(cc1/cc1plus):将预处理后的代码编译为汇编代码;
- 汇编器(as):将汇编代码转为二进制目标文件(.o);
- 链接器(ld):将目标文件、库文件链接为可执行程序/库。
- 版本查看
# 查看 GCC 版本
gcc@gcc:~/2026/c$ gcc --version
gcc (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
Copyright (C) 2023 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# # C++ 编译版本(GCC 对 C++ 的封装)
gcc@gcc:~/2026/c$ g++ --version
g++ (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
Copyright (C) 2023 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- 文件名后缀的约定
| 后缀 | 语言类型 | 编译工具 |
|---|---|---|
| .c | C语言 | gcc |
| .cpp/.cc/.C | C++语言 | g++ |
| .o | 目标文件 | 链接阶段 |
| .a | 静态库 | 链接阶段 |
| .so | 动态库 | 链接阶段 |
1.2、基础用法
- 一步生成可执行文件
# 编译c程序,生成默认可执行文件a.out
gcc main.c
# 编译 C++ 程序,生成默认可执行文件 a.out
gcc main.cpp
# 通过-o指定输出程序的文件名
gcc main.c -o main
- 分步编译(4个阶段) 阶段1,预处理(-E),生成预处理后的文件(.i)。进行宏展开、删除注释、头文件包含。
gcc -E main.c -o main.i
阶段2,编译(-S),生成汇编代码(.s)
gcc -S main.i -o main.s # 从.i文件生成
# 直接从.c文件生成
gcc -S main.c -o main.s
阶段3,汇编(-c),生成目标文件(.o)
gcc -c main.s -o main.o # 从.s文件生成
# 直接从.c文件生成
gcc -c main.c -o main.o
阶段4,链接,生成可执行文件
gcc main.o -o main # 从.o文件生成
# 直接从.c文件生成,指定执行4个步骤
gcc main.c -o main
1.3、核心常用选项
- 基础编译
-o file:指定输出文件名;-E:只进行预处理,不编译和汇编;-S:只进行预处理和编译,不进行汇编;-c:进行预处理、编译和汇编。
- 警告与调试
-Wall:开启所以常用警告(推荐),还是会编译成功生成目标文件;-Werror:将所有警告都变为错误,编译失败;-g:生成调试信息,用于gdb调试;-ggdb:生成gdb专用调试信息(更全)。
- 优化(性能)
-o0:默认,不优化(调试用);-o1:基础优化(速度/体积平衡)-o2:常用优化,发布版本推荐;-o3:激进优化,速度快,体积更大;-os:优化体积最小,一般用于嵌入式;
- 指定标准与宏
-std=c99 / c11 / gnu11:指定C标准;-D MACR0:定义宏(例如:DEBUG=1);-U MACR0:取消宏定义。
- 路径与库
-I dir:添加头文件搜索路径;如-I ./include;用于头文件不在系统默认路径(/usr/include、/usr/local/include)时;-L dir:添加库文件搜索路径;如-L ./lib;-l lib:链接指定的库,如-lm会链接libm.so库(省略lib前缀和.a/.so后缀);-static:静态链接,库会嵌入到程序中,无依赖;-shared -fPIC:生成动态库.so(-fPIC 位置无关代码)。
[! 注意] 运行时动态库找不到问题
- 临时:
LD_LIBRARY_PATH=库路径 ./程序;- 永久:将库路径添加到
/etc/ld.so.conf,执行ldconfig;- 编译时指定运行库路径:
gcc main.c -o main -L./ -ltest -Wl,-rpath=./。
- 输出编译过程
-v:查看 GCC 编译的详细过程(包括预处理器、编译器、链接器的调用命令),用于排查编译 / 链接问题
1.4、多文件编译
程序包含多个源文件时使用:
- 一次性编译
gcc main.c fun.c -o app
- 分步编译
# 先将多个源文件编译为目标文件
gcc -c main.c -o main.o
gcc -c fun.c -o fun.o
# 链接所有目标文件为可执行文件
gcc main.o fun.o -o app