AIGC标识 C语言编译-来自元宝

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=

十二、常见坑

  1. -o 后面的名字别跟源文件重名,否则覆盖源文件
  2. -l 放源文件后面,不然链接器找不到符号
  3. -Wall 不是所有警告,加 -Wextra 才更全
  4. -O0 调试,-O2 发布,别搞反
  5. -D 定义的宏在代码里可以直接用 #ifdef 判断
posted @ 2026-10-16 17:24  还在printf  阅读(2)  评论(0)    收藏  举报