mcpField
G
gcc

gcc

github.com/mohitmishra786开发269702 次安装18 周前更新
代码仓库

关于 gcc

面向 Agent 的 GCC 技能,指导选择编译选项、构建模式、警告设置和优化,并排查常见构建错误。涵盖适用于 GNU Make、CMake 或 shell 脚本项目的 LTO 与 PGO 流程。

主要功能

  1. 01选择调试和发布构建选项
  2. 02配置警告和调试信息
  3. 03调整优化、LTO 和 PGO
  4. 04排查常见编译与链接错误
  5. 05检查预处理结果和汇编输出

适用场景

  1. 01为 GCC 发布构建选择选项
  2. 02排查未定义引用或 ABI 错误
  3. 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 — 包含宏定义(配合 GDB macro 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 truncated32 位相对重定位溢出使用 -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 构建的二进制文件

评论

支持 Markdown