next up previous
: この文書について... : man_c5 : ポインタ、及び構造体

リンクとmake

ここでは、これらのいくつかのプログラムをコンパイルして実行ファイルを作成する方法を説明する。

6」 のプログラムは 2 つのファイルから成っている。そのため、これらのファ イルをそれぞれコンパイルしてオブジェクトファイルを作り、リンクするという作業を行わなければいけない。これまで「コンパイル」と言ってきた操作は、

の 2 つの操作を指してきたが、厳密には前者の操作を「コンパイル」と言う。 標準ライブラリを使う場合ももちろん同様の操作をしなければいけないが、通常 はプログラマが手を煩わせる事は無いはずである(math.h の場合は別だっ たが)。コンパイルとリンクの方法はいくつかあるが、ここでは 2 つの方法を紹 介する。

1 つは文字通り 1 つずつコンパイルしてオブジェクトファイルを作り、リンクする方法である。すなわち、


s1:~/c_text> gcc -c ran.c -o ran.o
s1:~/c_text> gcc -o random_walk random_walk.c ran.o
である。もちろん、この 2 つを毎回行うのはある意味確実な方法だが、作業効率が悪い。ある人はこれを shell script に書いてしまえば良いと考えるかも知れない。それも悪くは無いが、根本的には何も解決していない。ここで言う「作業効率が良い」とは、どれだけシステムに無駄な作業をさせないかという事を意味している。

そこであげるもう 1 つの方法が、make を使う方法である。詳しい解 説は参考図書 (4) に譲るとして、ここでは最も初歩的な使い方について説明す る。make とはCの様なコンパイル言語のコンパイル、リンクの作業を支援するツールである。その大きな特徴は必要となるファイル(コンポーネント)と出来上がるファイル(ターゲット)との時間関係、階層構造をチェックし、必要最小限のコンパイルなどの操作を行う点である。

make ではあらかじめ Makefile というファイルを用意する。以下に今回のプログラムに用いられる Makefile の例を示す。


Makefile -------------------------------------------------------------

random_walk: random_walk.c ran.o
(tab)gcc -o random_walk random_walk.c ran.o

ran.o : ran.c

(tab)gcc -c ran.c -o ran.o

clean:
(tab)rm *.o *~

----------------------------------------------------------------------

ここでは


ターゲット : コンポーネント コンポーネント …
(tab)実行コマンド
を 1 つの単位とする。''(tab)'' は「タブキー」をいれることを表す。実行コマンドの前にはタブをいれなければいけない。make を実行する時はコマンドプロンプトに 'make ターゲット' と叩く。そうすると、ターゲットと各コンポーネントとの時間関係を調べ、ターゲットに対してコンポーネントが更新されていれば実行コマンドを実行する。そうでなければ、何もせずに終了する。また、コンポーネントが下の階層でターゲットとして指定されていれば、そちらから参照して、同様の操作を行い、上の階層に進んで行く。

ここの例ではコマンドプロンプトから 'make random_walk' と叩けば よい。例えば、全てのオブジェクトファイル、実行ファイルが無い場合は、


s1:~/c_text> make random_walk
gcc -c ran.c -o ran.o
gcc -o random_walk random_walk.c ran.o
s1:~/c_text>
となる。'random_walk.c' のみを更新した場合は、

s1:~/c_text> make random_walk
gcc -o random_walk random_walk.c ran.o
s1:~/c_text>
の様になる。

また、上の Makefile にあるように、ターゲットとして 'clean' を定義しておくと、コマンドプロンプトで 'make clean' と打てば、いらなくなったオブジェクトファイルや '' '' の付 いたファイルを消去してくれるので便利である(rm * で全てのファイ ルを消去してしまう危険性が格段に減る!!)。


参考図書


(1) はじめての ''C''(椋田實 技術評論社)
(2) NUMERICAL RECIPES in C[日本語版](William H. Oress, Saul A. Teukolsky, William T. Vetterling, Brian P. Flannery(丹慶勝市・奥村晴彦・佐藤俊郎・小林誠 訳) 技術評論社)
(3) 計算物理 (早野龍五・高橋忠幸 共立出版)
(4) make(Andrew Oram, Steve Talbott(菊池彰 訳) オライリージャパン)
(5) 理工系数学のキーポイント●6 キーポイント 確率・統計(和達三樹・十河清 岩波書店)