>> >> >> Reference << << << <<<<<<Ref>>>>>>
C/C++ GCC
Update: 2026-03-09 >> Creator:ljf12825

基本概念

基础语法

gcc/g++ [选项] [源文件] [选项] [目标文件]

常用选项

基本选项

选项作用
-o <file>指定输出文件名
-c只编译不链接,生成目标文件(.o)
-E只进行预处理不编译
-S编译到汇编语言,不汇编
-v显示编译过程的详细信息
输出默认文件名
gcc main.c
输出指定文件名
gcc main.c -o main

gcc内部进行以下四个阶段

  1. 预处理:处理宏定义、头文件包含等
  2. 编译:将预处理后的文件编译成汇编代码
  3. 汇编:将汇编代码转换成机器码
  4. 链接:将目标文件链接成可执行文件

在链接完成后,中间文件会被删除掉

预处理

不指定文件名

gcc -E main.c

这会执行标准输出,将结果打印到屏幕上

指定文件名

gcc -E main.c -o main.i

main.i这个名字可以自定义,扩展名也可以自定义,比如.txt, .abc

常见约定

扩展名含义常用性
.i预处理后的C文件最常用
.ii预处理后的C++文件最常用
.txt文本文件可用
无扩展名任意文件名不推荐

同理对于.s, .o文件也是一样的,这对于gcc来说是可以的,但对于make或其他通过扩展名判断文件类型的工具来说未必行得通

编译
gcc -S main.i -o main.s

main.s是gcc编译阶段最后的人类可读的文件

汇编
gcc -c main.s -o main.o

.o文件里有

链接
gcc main.o -o main

警告选项

选项作用
-Wall显示所有常见警告
-Wextra显示额外警告
-Werror将警告视为错误
-w禁止所有警告
-pedantic遵循标准C,提醒非标准用法

GCC只会报真正严重的语法错误或链接错误

但像初始化、隐式转换、可能丢失精度等警告,默认不报

GCC设计之初遵循“兼容老代码”原则,C语言历史上很多老程序有未初始化、隐式转换等现象,默认警告太多导致就代码编译报满屏,用户体验很差

因此,开发中推荐的做法是

gcc -Wall -Wextra -Werror main.c

这样可以保证代码更安全、更规范,尤其是底层/库开发、游戏引擎开发、嵌入式开发等

-Wall

开启常用警告,比如

但不会开启一些“更严格的检查”

-Wextra

常见警告示例

类型示例代码警告
未使用参数int f(int x){return 0;}unused parameter 'x'
空函数体void f(){}empty body (depends)
不完全初始化数组int arr[5] = {1,2};missing initializer for element 2
多余的逗号int arr[] = {1,2,};extra comma
隐式int转换char c = 200;oveerflow in implicit constant conversion
return没有值int f(){}control reaches end of non-void function

不同版本GCC会有差异

优化选项

选项作用
-O0不优化(默认)
-O1基本优化
-O2进一步优化(推荐)
-O3最高级别优化
-Os优化代码大小

调试选项

选项作用
-g生成调试信息
-ggdb生成GDB专用的调试信息
-pg生成性能分析信息

语言标准选项

-std

gcc -std=c99 file.c

使用示例

基本编译

# 编译单个文件
gcc main.c -o main
g++ main.cpp -o main

# 编译并运行
gcc main.c -o main && ./main

多文件编译

# 方式1:直接编译多个文件
gcc file1.c file2.c file3.c -o program

# 方式2:分步编译(适合大型项目)
gcc -c file1.c -o file1.o
gcc -c file2.c -o file2.o
gcc file1.o file2.o -o program

链接库文件

# 链接数学库
gcc program.c -o program -lm

# 链接pthread线程库
g++ program.cpp -o program -lpthread

# 指定库路径
g++ program.cpp -o program -L/path/to/lib -lmylib

包含头文件

# 添加头文件搜索路径
g++ program.cpp -o program -I/path/to/include

编译过程

gcc/g++编译分为四个阶段

gcc vs g++