表示テーマ
Build — コンパイルとリンク
TL;DR
ヘッダーは宣言を共有し、オブジェクトファイルはコンパイル結果を保持します。複数のオブジェクトと必要なライブラリをリンクして実行ファイルを作ります。
ビルドの流れ
text
ソース (.c)
→ プリプロセス(#include、マクロなど)
→ コンパイル(アセンブリへ)
→ アセンブル(オブジェクト .o へ)
→ リンク(実行ファイルへ)これは一般的なツールチェーンの説明です。実際に各段階が別プログラムや中間ファイルとして現れるかは処理系によります。
Example
C overviewの main.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 するだけでは、別ファイルにある関数の定義をリンクしたことにはなりません。
Related
参考
GCC: Overall Options。GCC固有のオプションはAIXの別コンパイラに無条件で流用しません。