Gcc

mohitmishra786/low-level-dev-skills/skills/compilers/gcc

作者 mohitmishra786bdc58472fa9f無授權條款253 個星標收錄於 2026年10月9日更新於 2026年10月9日儲存庫3 個月前更新

GCC compiler skill for C/C++ projects. Use when selecting optimization levels, warning flags, debug builds, LTO, sanitizer instrumentation, or diagnosing compilation errors with GCC. Covers flag selection for debug vs release, ABI concerns, preprocessor macros, profile-guided optimization, and integration with build systems. Activates on queries about gcc flags, compilation errors, performance tuning, warning suppression, or cross-standard compilation.

AI 產生的概覽

指導 GCC 編譯旗標選擇、建置模式、警告排查、LTO、PGO 以及常見 C/C++ 編譯錯誤。

功能
此技能為在 C 與 C++ 專案中使用 GCC 編譯器提供指引。內容涵蓋偵錯與發行建置的旗標選擇、警告處理原則、偵錯資訊選項、最佳化取捨、連結時最佳化、特性分析導向最佳化、前置處理器檢查,以及常見錯誤排查。它產出的是建議與命令列範例,而非檔案或指令碼。
適用情境
在為建置選擇 GCC 旗標、診斷編譯或連結錯誤、調校效能或二進位檔大小,或設定 LTO、PGO 與 sanitizer 插樁時使用。也適用於警告抑制、ABI 不相符與標準符合性相關的問題。
執行需求
不隨附指令碼,僅為說明性內容。假定已安裝 GCC,且專案使用 GNU Make、CMake 或 shell 指令碼。

GCC

Purpose

Guide agents through GCC invocation: flag selection, build modes, warning triage, PGO, LTO, and common error patterns. Assume the project uses GNU Make, CMake, or a shell script.

Triggers

  • "What flags should I use for a release build?"
  • "GCC is giving me a warning/error I don't understand"
  • "How do I enable LTO / PGO with GCC?"
  • "How do I compile with -fsanitize?"
  • "My binary is too large / too slow"
  • Undefined reference errors, ABI mismatch, missing symbols

Workflow

1. Choose a build mode

GoalRecommended flags
Debug-g -O0 -Wall -Wextra
Debug + debuggable optimisation-g -Og -Wall -Wextra
Release-O2 -DNDEBUG -Wall
Release (max perf, native only)-O3 -march=native -DNDEBUG
Release (min size)-Os -DNDEBUG
Sanitizer (dev)-g -O1 -fsanitize=address,undefined

Always pass -std=c11 / -std=c++17 (or the required standard) explicitly. Never rely on the implicit default.

2. Warning discipline

Start with -Wall -Wextra. For stricter standards compliance add -Wpedantic. To treat all warnings as errors in CI: -Werror.

Suppress a specific warning only in a narrow scope:

c
#pragma GCC diagnostic push#pragma GCC diagnostic ignored "-Wunused-parameter"// ...#pragma GCC diagnostic pop

Do not pass -w (silences everything) except as a last resort for third-party headers.

3. Debug information

  • -g — DWARF debug info, default level 2
  • -g3 — includes macro definitions (useful with GDB macro expand)
  • -ggdb — DWARF extensions optimal for GDB
  • -gsplit-dwarf — splits .dwo files; reduces link time, needed for debuginfod

Pair -g with -Og (not -O0) when you need readable optimised code in GDB.

4. Optimisation decision tree

text
Need max throughput on a fixed machine?  yes -> -O3 -march=native -flto  no  -> profiling available?           yes -> -O2 -fprofile-use           no  -> -O2Size-constrained (embedded, shared lib)?  yes -> -Os  (or -Oz with clang)

-O3 vs -O2: -O3 adds aggressive loop transformations (-funswitch-loops, -fpeel-loops, -floop-interchange) and more aggressive inlining. Use -O3 only after benchmarking; it occasionally regresses due to i-cache pressure.

-Ofast: enables -ffast-math which breaks IEEE 754 semantics (NaN handling, associativity). Avoid unless the numerical domain explicitly permits it.

5. Link-time optimisation (LTO)

bash
# Compilegcc -O2 -flto -c foo.c -o foo.ogcc -O2 -flto -c bar.c -o bar.o# Link (must pass -flto again)gcc -O2 -flto foo.o bar.o -o prog

Use gcc-ar / gcc-ranlib instead of ar / ranlib when archiving LTO objects into static libs.

For parallel LTO: -flto=auto (uses make-style jobserver) or -flto=N.

See references/flags.md [blocked] for full flag reference. See skills/binaries/linkers-lto for linker-level LTO configuration.

6. Profile-guided optimisation (PGO)

bash
# Step 1: instrumentgcc -O2 -fprofile-generate prog.c -o prog_inst# Step 2: run with representative workload./prog_inst < workload.input# Step 3: optimise with profilegcc -O2 -fprofile-use -fprofile-correction prog.c -o prog

-fprofile-correction handles profile data inconsistencies from multi-threaded runs.

7. Preprocessor and standards

  • Inspect macro expansion: gcc -E file.c | less
  • Dump predefined macros: gcc -dM -E - < /dev/null
  • Force strict standard: -std=c11 -pedantic-errors
  • Disable GNU extensions: -std=c11 (not -std=gnu11)

8. Common error triage

SymptomLikely causeFix
undefined reference to 'foo'Missing -lfoo or wrong link orderAdd -lfoo; move -l flags after object files
multiple definition of 'x'Variable defined (not just declared) in a headerAdd extern in header, define in one .c
implicit declaration of functionMissing #includeAdd the header
warning: incompatible pointer typesWrong cast or missing prototypeFix the type; check headers
ABI errors with C++Mixed -std= or different libstdc++Unify -std= across all TUs
relocation truncatedOverflow on a 32-bit relative relocationUse -mcmodel=large or restructure code

For sanitizer reports, use skills/runtimes/sanitizers.

9. Useful one-liners

bash
# Show all flags enabled at -O2gcc -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 pathgcc -v -E - < /dev/null 2>&1 | grep -A20 '#include <...>'
# Check if a flag is supportedgcc -Q --help=target | grep march

For a complete flag cheatsheet, see references/flags.md [blocked]. For common error patterns and examples, see references/examples.md [blocked].

Related skills

  • Use skills/runtimes/sanitizers to add -fsanitize=* builds
  • Use skills/compilers/clang when switching to clang/LLVM
  • Use skills/binaries/linkers-lto for advanced LTO linker flags
  • Use skills/debuggers/gdb for debugging GCC-built binaries

來源與署名

來源:mohitmishra786/low-level-dev-skills位於skills/compilers/gcc提交bdc5847

授權條款: 無授權條款

內容歸原作者所有。SourceWeft 從公開儲存庫中收錄這些內容。

檢舉或申請下架