第46回
makeによるマルチモジュール開発の合理化

生成過程の合理化と依存関係

ソースファイルから実行形式ファイルを生成する過程には、一定の規則が存在します。それを把握・整理してコンパイラを制御すれば、合理的な開発が行えます。

プログラムの生成過程

ここで、Cプログラムの生成過程を再確認しておきましょう。

(1) .cソースファイルから .objオブジェクトファイルが生成される。
(2) (1)で生成された .objオブジェクトファイルとスタートアップルーチン、ライブラリ内の関数がリンクされて実行形式ファイルが生成される。

(1)の段階では、 .cソースファイルの冒頭で .hヘッダファイルが読み込まれます。stdio.hやstdlib.hなどライブラリ関数のためのヘッダファイルは処理系にあらかじめ用意されているものなので、書き換えられることはありません。しかし、前回紹介したstconv.hのように、プログラム独自の構造体定義や関数の宣言を記述したヘッダファイルは、バグの修正や改良などで書き換えられることがよくあります。

プログラム生成の規則

このように見ていくと、以下のことが分かります。

(a) あるオブジェクトファイルは、特定の .cまたは .hソースファイルから生成される。
(b) 実行形式ファイルは特定のオブジェクトファイル群から生成される。

たとえばstconvの場合なら、これは以下のような規則(ルール)となります。

(1) ソースファイルstconv.cとstconv.hから
        → オブジェクトファイルstconv.objが生成される

(2) ソースファイルdatinit.cとstconv.hから
        → オブジェクトファイルdatinit.objが生成される

(3) ソースファイルconvert.cとstconv.hから
        → オブジェクトファイルconvert.objが生成される

(4) オブジェクトファイルstconv.obj、datinit.obj、convert.objから
        → 実行形式ファイルstconv.exe(WindowsまたはMS-DOSの場合)が生成される ※1

UNIX系OSのGCCでは実行形式ファイルに拡張子は付かず、「実行可能」を表す属性が与えられます。また、オブジェクトファイルの拡張子は .oとなります

プログラムとソースの依存関係

上記のルールを見れば、個々の .cソースファイルが変更されたときには、それらが単独でコンパイルされてオブジェクトファイルが生成される――ということはもちろん、ヘッダファイルstconv.hが書き換えられた場合には、結果的にそれを冒頭で取り込んでいる3つの .cソースファイルが書き換えられたことになり、それら3つの .cソースファイルが再コンパイルされなければならない――ということが分かります。

このような状態を
3つの .cソースファイルはヘッダファイルstconv.hに
依存している
と表現します。

このことは、実行形式ファイルがどのようなオブジェクトファイルから生成されているか――という状態にも適用されます。
実行形式ファイルstconv.exeは、
stconv.obj、datinit.obj、convert.objの
3つのオブジェクトファイルに依存している
ということです。

こういった「あるファイルが別のファイルの変更に影響を受ける」ような関係を『依存関係』と呼びます。