mcpField
G
gcc

gcc

github.com/mohitmishra786開発269702 回インストール18 週間前に更新
リポジトリ

gcc について

GCC のフラグ、ビルドモード、警告、最適化、一般的なビルドエラーを扱うエージェント向けスキルです。GNU Make、CMake、シェルスクリプトを使うプロジェクト向けに LTO と PGO の手順も説明します。

主な機能

  1. 01デバッグおよびリリース用フラグの選択
  2. 02警告とデバッグ情報の設定
  3. 03最適化、LTO、PGO の調整
  4. 04一般的なコンパイル・リンクエラーの診断
  5. 05プリプロセス結果とアセンブリ出力の確認

活用シーン

  1. 01GCC のリリースビルド用フラグを選択
  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

目的

エージェントが 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 truncated32 ビット相対リロケーションのオーバーフロー-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 を使用します

コメント