Skip to content

Build — コンパイルとリンク

TL;DR

ヘッダーは宣言を共有し、オブジェクトファイルはコンパイル結果を保持します。複数のオブジェクトと必要なライブラリをリンクして実行ファイルを作ります。

ビルドの流れ

text
ソース (.c)
  → プリプロセス(#include、マクロなど)
  → コンパイル(アセンブリへ)
  → アセンブル(オブジェクト .o へ)
  → リンク(実行ファイルへ)

これは一般的なツールチェーンの説明です。実際に各段階が別プログラムや中間ファイルとして現れるかは処理系によります。

Example

C overviewmain.c を用いたGCC向けの例です。

sh
gcc -std=c99 -Wall -Wextra -Wpedantic -c main.c -o main.o
gcc main.o -o app
./app

-c はリンクせずにオブジェクトを作る指定です。通常は ld を直接呼ぶより、コンパイラドライバ経由でリンクし、必要なランタイムの組み込みを任せます。

エラーの切り分け

段階症状の例確認するもの
プリプロセスヘッダーが見つからないinclude名、探索パス
コンパイル型や宣言のエラー宣言と定義、引数の型
リンクundefined referenceなど必要な .o、ライブラリ、シンボル名

宣言を #include するだけでは、別ファイルにある関数の定義をリンクしたことにはなりません。

参考

GCC: Overall Options。GCC固有のオプションはAIXの別コンパイラに無条件で流用しません。