关于 gcc
面向 Agent 的 GCC 技能,指导选择编译选项、构建模式、警告设置和优化,并排查常见构建错误。涵盖适用于 GNU Make、CMake 或 shell 脚本项目的 LTO 与 PGO 流程。
主要功能
- 01选择调试和发布构建选项
- 02配置警告和调试信息
- 03调整优化、LTO 和 PGO
- 04排查常见编译与链接错误
- 05检查预处理结果和汇编输出
适用场景
- 01为 GCC 发布构建选择选项
- 02排查未定义引用或 ABI 错误
- 03设置基于性能分析的优化
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill gcc安装后在 Claude Code 中输入/gcc确认已加载。
附带文件references/examples.mdreferences/flags.md
详细介绍
GCC
用途
指导 Agent 调用 GCC:选择标志、构建模式、警告分类、PGO、LTO 和常见错误模式。假设项目使用 GNU Make、CMake 或 shell 脚本。
触发条件
- “发布构建应该使用哪些标志?”
- “GCC 报了一个我不理解的警告/错误”
- “如何在 GCC 中启用 LTO/PGO?”
- “如何使用
-fsanitize编译?” - “我的二进制文件太大/太慢”
- 未定义引用错误、ABI 不匹配、缺少符号
工作流
1. 选择构建模式
| 目标 | 推荐标志 |
|---|---|
| 调试 | -g -O0 -Wall -Wextra |
| 调试 + 可调试的优化 | -g -Og -Wall -Wextra |
| 发布 | -O2 -DNDEBUG -Wall |
| 发布(最高性能,仅限本机) | -O3 -march=native -DNDEBUG |
| 发布(最小体积) | -Os -DNDEBUG |
| Sanitizer(开发) | -g -O1 -fsanitize=address,undefined |
始终显式传入 -std=c11/-std=c++17(或所需的标准)。切勿依赖隐式默认值。
2. 警告规范
从 -Wall -Wextra 开始。若要更严格地遵守标准,可添加 -Wpedantic。在 CI 中将所有警告视为错误:-Werror。
仅在有限范围内屏蔽特定警告:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
// ...
#pragma GCC diagnostic pop
除非不得已要处理第三方头文件,否则不要传入 -w(它会屏蔽所有警告)。
3. 调试信息
-g— DWARF 调试信息,默认级别为 2-g3— 包含宏定义(配合 GDBmacro expand使用时很有用)-ggdb— 针对 GDB 优化的 DWARF 扩展-gsplit-dwarf— 拆分.dwo文件;可缩短链接时间,是debuginfod所需的选项
需要在 GDB 中查看易读的优化代码时,将 -g 与 -Og(而非 -O0)搭配使用。
4. 优化决策树
Need max throughput on a fixed machine?
yes -> -O3 -march=native -flto
no -> profiling available?
yes -> -O2 -fprofile-use
no -> -O2
Size-constrained (embedded, shared lib)?
yes -> -Os (or -Oz with clang)
-O3 与 -O2:-O3 会增加激进的循环变换(-funswitch-loops、-fpeel-loops、-floop-interchange),并进行更激进的内联。只有在基准测试后才使用 -O3;它偶尔会因指令缓存压力而导致性能倒退。
-Ofast:会启用 -ffast-math,从而破坏 IEEE 754 语义(NaN 处理、结合律)。除非数值领域明确允许,否则应避免使用。
5. 链接时优化(LTO)
# Compile
gcc -O2 -flto -c foo.c -o foo.o
gcc -O2 -flto -c bar.c -o bar.o
# Link (must pass -flto again)
gcc -O2 -flto foo.o bar.o -o prog
将 LTO 对象归档到静态库时,使用 gcc-ar/gcc-ranlib,而不是 ar/ranlib。
并行 LTO 可使用 -flto=auto(使用类似 make 的作业服务器),或 -flto=N。
完整标志参考请参见 references/flags.md。链接器级别的 LTO 配置请参见 skills/binaries/linkers-lto。
6. 基于配置文件的优化(PGO)
# Step 1: instrument
gcc -O2 -fprofile-generate prog.c -o prog_inst
# Step 2: run with representative workload
./prog_inst < workload.input
# Step 3: optimise with profile
gcc -O2 -fprofile-use -fprofile-correction prog.c -o prog
-fprofile-correction 可处理多线程运行导致的配置文件数据不一致问题。
7. 预处理器和标准
- 检查宏展开:
gcc -E file.c | less - 转储预定义宏:
gcc -dM -E - < /dev/null - 强制使用严格标准:
-std=c11 -pedantic-errors - 禁用 GNU 扩展:
-std=c11(而非-std=gnu11)
8. 常见错误分类
| 症状 | 可能原因 | 修复方法 |
|---|---|---|
undefined reference to 'foo' | 缺少 -lfoo 或链接顺序错误 | 添加 -lfoo;将 -l 标志移到对象文件之后 |
multiple definition of 'x' | 在头文件中定义(而不只是声明)变量 | 在头文件中添加 extern,并在一个 .c 文件中定义 |
implicit declaration of function | 缺少 #include | 添加头文件 |
warning: incompatible pointer types | 类型转换错误或缺少函数原型 | 修正类型;检查头文件 |
| C++ ABI 错误 | 混用了不同的 -std= 或不同的 libstdc++ | 在所有 TU 中统一 -std= |
relocation truncated | 32 位相对重定位溢出 | 使用 -mcmodel=large 或重构代码 |
Sanitizer 报告请参见 skills/runtimes/sanitizers。
9. 实用单行命令
# Show all flags enabled at -O2
gcc -Q --help=optimizers -O2 | grep enabled
# Preprocess only (check includes/macros)
gcc -E -dD src.c -o src.i
# Assembly output (Intel syntax)
gcc -S -masm=intel -O2 foo.c -o foo.s
# Show include search path
gcc -v -E - < /dev/null 2>&1 | grep -A20 '#include <...>'
# Check if a flag is supported
gcc -Q --help=target | grep march
完整的标志速查表请参见 references/flags.md。 常见错误模式和示例请参见 references/examples.md。
相关技能
- 使用
skills/runtimes/sanitizers添加-fsanitize=*构建 - 切换到 clang/LLVM 时使用
skills/compilers/clang - 使用
skills/binaries/linkers-lto配置高级 LTO 链接器标志 - 使用
skills/debuggers/gdb调试由 GCC 构建的二进制文件