コンパイルの仕組み: 裏側で起きていること
ただコマンドを打つだけでなく、ソースコードが実行ファイルになるまでの4段階を理解する。
詳細解説
初心者は「gcc
コマンド一発で変換される」と思いがちですが、実は内部では4つの工程を経て実行ファイルが作られています。これを料理に例えるとわかりやすいです。
4つの段階
GCCのオプションを使うと、各段階で止めてファイルの中身を確認できます。
# 1. プリプロセス (Preprocess)# #include や #define を展開するgcc -E hello.c -o hello.i
# 2. コンパイル (Compile)# C言語をアセンブリ言語に翻訳するgcc -S hello.i -o hello.s
# 3. アセンブル (Assemble)# アセンブリを機械語(オブジェクトファイル)にするgcc -c hello.s -o hello.o
# 4. リンク (Link)# ライブラリと結合して実行可能ファイルを作るgcc hello.o -o hello実践テクニック
なぜこれを知る必要があるのか?
エラーが出たとき、「どの段階で失敗したか」がわかると解決が早いからです。
file not found→ プリプロセス(ヘッダがない)syntax error→ コンパイル(文法ミス)undefined reference→ リンク(ライブラリのリンク忘れ)
警告オプションの鉄則
現場では警告を無視するエンジニアに未来はありません。常に警告オプションを付けましょう。
// 実践: 警告オプションは「常時ON」が鉄則// -Wall: 一般的な警告を有効化// -Wextra: さらに詳細な警告// -std=c17: C17規格に準拠
gcc -Wall -Wextra -std=c17 hello.c -o hello演習課題
クイズ: エラーの原因
「undefined reference to printf」というエラーが出ました。どの段階での失敗ですか?
解答例を見る
リンク (Linker) の段階です。
「undefined reference(未定義の参照)」は、ヘッダファイルには宣言があったけれど(コンパイルは通った)、実際の実体(ライブラリ)が見つからなかったときに発生します。
合格ライン
コンパイルの4段階を言える
undefined reference エラーの意味がわかる
-Wall -Wextra を使っている