導入
cc -o app main.c utils.c のように一発でビルドもできますが、ファイルが増えると「1つ直しただけで全部を再コンパイル」になってしまいます。そこで各ソースを個別に .o へコンパイルし、最後にまとめてリンクします。こうすると make が「変わった .c の .o だけ」を作り直せます。
説明
3つのルールに分けます。
app: main.o utils.o
cc -o app main.o utils.o
main.o: main.c
cc -c main.c
utils.o: utils.c
cc -c utils.c
依存関係は木構造になります。
flowchart TD APP["app(実行ファイル)"] --> MO["main.o"] APP --> UO["utils.o"] MO --> MC["main.c"] UO --> UC["utils.c"]
make は木の葉から順にたどります。app を作るには main.o と utils.o が要る → それぞれ main.c / utils.c から cc -c で作る → そろったら cc -o app でリンク。cc -c main.c はコンパイルだけして main.o を作るコマンドです。
やってみよう
make を実行して、main.o → utils.o → app の順にコマンドが走るのを見ましょう。次に touch utils.c してから make。utils.o と app だけが作り直され、main.o は作り直されないことを確認してください。これが分割コンパイルの効き目です。
演習
一度 make してビルドしたあと、touch main.c してから再度 make してください。main.o と app が作り直され、utils.o は作り直されないことを確かめましょう。
ヒント1を見る
touch main.c は main.c を「新しく」します。main.o は main.c に依存しているので作り直されます。
ヒント2を見る
utils.c は変えていないので、utils.o は「最新の状態」で作り直されません。