gcc について
GCC のフラグ、ビルドモード、警告、最適化、一般的なビルドエラーを扱うエージェント向けスキルです。GNU Make、CMake、シェルスクリプトを使うプロジェクト向けに LTO と PGO の手順も説明します。
主な機能
- 01デバッグおよびリリース用フラグの選択
- 02警告とデバッグ情報の設定
- 03最適化、LTO、PGO の調整
- 04一般的なコンパイル・リンクエラーの診断
- 05プリプロセス結果とアセンブリ出力の確認
活用シーン
- 01GCC のリリースビルド用フラグを選択
- 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
目的
エージェントが GCC の呼び出し方法を理解できるよう、フラグの選択、ビルドモード、警告の切り分け、PGO、LTO、一般的なエラーパターンを案内します。プロジェクトでは GNU Make、CMake、またはシェルスクリプトを使用しているものとします。
トリガー
- 「リリースビルドにはどのフラグを使えばよいですか?」
- 「GCC で理解できない警告やエラーが表示されます」
- 「GCC で LTO / PGO を有効にするにはどうすればよいですか?」
- 「
-fsanitizeを使ってコンパイルするにはどうすればよいですか?」 - 「バイナリが大きすぎる/遅すぎます」
- 未定義参照エラー、ABI の不一致、シンボルの欠落
ワークフロー
1. ビルドモードを選択する
| 目的 | 推奨フラグ |
|---|---|
| デバッグ | -g -O0 -Wall -Wextra |
| デバッグ+デバッグ可能な最適化 | -g -Og -Wall -Wextra |
| リリース | -O2 -DNDEBUG -Wall |
| リリース(最大パフォーマンス、ネイティブ環境のみ) | -O3 -march=native -DNDEBUG |
| リリース(サイズ最小化) | -Os -DNDEBUG |
| サニタイザー(開発用) | -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 と -O0 ではなく -Og を組み合わせてください。
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 はベンチマークの後にのみ使用してください。i-cache の圧迫により、性能が低下することがあります。
-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 オブジェクトを静的ライブラリにアーカイブする場合は、ar / ranlib の代わりに gcc-ar / gcc-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 を追加し、1 つの .c ファイルで定義します |
implicit declaration of function | #include の不足 | ヘッダーを追加します |
warning: incompatible pointer types | キャストの誤り、またはプロトタイプの不足 | 型を修正し、ヘッダーを確認します |
| C++ の ABI エラー | -std= の混在、または libstdc++ の違い | すべての TU で -std= を統一します |
relocation truncated | 32 ビット相対リロケーションのオーバーフロー | -mcmodel=large を使用するか、コードを再構成します |
サニタイザーのレポートについては、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 を参照してください。
関連スキル
-fsanitize=*ビルドを追加するには、skills/runtimes/sanitizersを使用します- clang/LLVM に切り替えるには、
skills/compilers/clangを使用します - 高度な LTO リンカーフラグには、
skills/binaries/linkers-ltoを使用します - GCC でビルドしたバイナリをデバッグするには、
skills/debuggers/gdbを使用します