GCC 常用编译参数速查笔记
一、基础输出
| 参数 |
作用 |
示例 |
-o <文件> |
指定输出文件名 |
gcc demo.c -o demo.exe |
记忆:-o = output,后面紧跟输出文件名,不能跟源文件重名
二、编译流程控制
| 参数 |
作用 |
-c |
只编译不链接,生成 .o 目标文件 |
-E |
只预处理,看宏展开结果(生成 .i) |
-S |
编译到汇编,生成 .s 文件 |
gcc -c main.c # 生成 main.o
gcc -E demo.c > demo.i # 看预处理结果
gcc -S demo.c # 生成 demo.s 汇编文件
三、警告(推荐全开)
| 参数 |
作用 |
-Wall |
打开常用警告(名字有误导性,不是"所有") |
-Wextra |
额外警告,配合 -Wall 用 |
-Werror |
把警告当错误,有警告就编译失败 |
-Wpedantic |
严格遵循 C 标准,拒绝编译器扩展 |
-Wshadow |
变量名遮蔽时警告 |
-Wunused |
未使用的变量/函数警告 |
推荐日常写法:
gcc -Wall -Wextra -Werror demo.c -o demo
四、优化
| 参数 |
作用 |
-O0 |
不优化(默认,调试用) |
-O1 |
基础优化 |
-O2 |
推荐,大部分项目用这个 |
-O3 |
激进优化,可能增大体积 |
-Os |
优化体积 |
-Ofast |
最高速,不严格遵循标准(浮点不精确) |
gcc -O2 demo.c -o demo # 发布
gcc -O0 -g demo.c -o demo # 调试
五、调试
| 参数 |
作用 |
-g |
生成调试信息(给 gdb 用) |
-ggdb |
gdb 专用调试信息 |
-g3 |
包含宏定义等更多信息 |
gcc -g -O0 demo.c -o demo
gdb ./demo
六、头文件与库
| 参数 |
作用 |
-I<路径> |
指定头文件搜索路径 |
-L<路径> |
指定库文件搜索路径 |
-l<库名> |
链接库(小写 L,放源文件后面) |
gcc main.c -I./include -L./lib -lm -o main
⚠️ -l 必须放在源文件后面,否则可能链接失败
七、宏定义
| 参数 |
作用 |
-D<宏> |
定义宏,等价于 #define 宏 |
-D<宏>=<值> |
定义带值的宏 |
gcc demo.c -DDEBUG -o demo
gcc demo.c -DVERSION=2 -o demo
八、标准与语言
| 参数 |
作用 |
-std=c89 / -std=c90 |
C89/C90 标准 |
-std=c99 |
C99 |
-std=c11 |
C11 |
-std=c17 |
C17(最新正式标准) |
-std=gnu11 |
C11 + GCC 扩展 |
九、其他实用参数
| 参数 |
作用 |
-pthread |
链接 pthread 线程库 |
-static |
静态链接,不依赖系统动态库 |
-shared |
生成共享库(.so / .dll) |
-fPIC |
生成位置无关代码(做动态库用) |
-M / -MM |
输出依赖关系(配合 Makefile) |
-v |
显示详细编译过程 |
-pipe |
用管道代替临时文件,编译更快 |
十、全能示例
gcc -Wall -Wextra -Werror -std=c11 -O2 -g \
-I./include -L./lib -lm \
main.c utils.c -o myapp
逐段解读:
-Wall -Wextra -Werror → 警告全开,警告当错误
-std=c11 → 使用 C11 标准
-O2 → 优化
-g → 带调试信息
-I./include → 头文件搜索路径
-L./lib -lm → 链接数学库
main.c utils.c → 源文件
-o myapp → 输出名
十一、记忆口诀
| 类别 |
参数 |
| 输出 |
-o |
| 只编译 |
-c |
| 警告 |
-Wall -Wextra -Werror |
| 优化 |
-O0 ~ -O3 |
| 调试 |
-g |
| 头文件 |
-I |
| 库 |
-L -l |
| 宏 |
-D |
| 标准 |
-std= |
十二、常见坑
-o 后面的名字别跟源文件重名,否则覆盖源文件
-l 放源文件后面,不然链接器找不到符号
-Wall 不是所有警告,加 -Wextra 才更全
-O0 调试,-O2 发布,别搞反
-D 定义的宏在代码里可以直接用 #ifdef 判断