makefileについて

1999/11/4

作成者    小西英雄

 

ここでは,makefileについて説明します.Makefileによって,複数のソースファイルをコンパイル,リンクさせ,実行ファイルを作ることができます.Makefileとは実行に必要なファイルを作るためのUNIX上で動かすプログラムが書かれたファイルです.

 

1        一般的なUNIXのコンパイル

 

 プログラムは普通複数のソースファイルで構成されており,このファイルを結合させて実行させる為にはリンクという作業が必要です.この作業について説明する前に,まずUNIXの一般的なコンパイルの方法を説明します.

 例えば main.c と言うファイルを作ったとします.これを実行させるには,コンパイルする必要があります.

そこでコマンドライン上で

cc main.c

と打ち込みます.するとプログラムに間違いがなければ何も表示せず終了し,

a.out

という実行ファイルが作られます.そしてコマンドライン上で

./a.out

と入力するとプログラムが実行できます.

 

2        複数のプログラムをコンパイル,リンクさせる方法

 

 次に複数あるソースファイルをリンクさせて実行する場合について説明します.

ここでまずmain.c sub.c というファイルがあるとします.この場合

cc main.c sub.c

と打ち込めば

a.out

と言う実行ファイルが作られるので,

./a.out

で実行できます.

 

 

 ここでsub.cに変更を加えた時,どのようにa.outを再生成すれば良いだろうか.

最も単純には同じ事を繰り返せば良いのですが,そうしないで,まず始めに

cc –c main.c

cc –c sub.c

cc main.o sub.o

と言う方法で.oファイルを生成しておけば

cc main.o sub.c

とするだけで済みます.つまりmain.cは変更されていないのでこれからmain.oを再生成する必要はないのです.

上のように2,3個のファイルをコンパイルする場合はこのように手作業でも良いのですが,

プログラムが多くなると,作業が煩わしくなります.そこでmakfileを使います.

 

3        makefileの使い方

 

 makefileUNIX上で走るプログラムのようなもので,これを起動させるにはプログラムが存在するディレクトリ内にmakefileを置き,コマンドライン上で

make

と打ち込みます.そうすれば自動的に複数のファイルをコンパイル,リンクして実行ファイルを作り出します.この実行ファイルを使って,プログラムを実行します.

ここで,コンパイル,リンクさせるファイルを指定するには,makefile中にある

OBJS =

にファイル名を書き込みます.ここでファイルの識別子として.cとなっているのを.oと書き代えます.

例えば,main.c sub.c と言うファイルがあれば,

OBJS = main.o sub.o

と書きます.

コンパイルした後,実行させるためのファイルができあがりますが

これの名前を指定するには,

PROGRAM =

に名前を書きます.例えば

PROGRAM = Result

とすれば,コンパイルしたあとにディレクトリ内に

Result

という実行ファイルができるので,

./Result

と打ち込めば,プログラムを実行できます.

4        makefileの例

 

以下にmakefileを記述します.

/****************make ファイル****************/

SYSLIB = -lm

EX_INCS              =

LDFLAGS              =

CC         = gcc

#OPTIONS =  -g -Wall

OPTIONS =  -g

OBJS              =main.o sub.o      /*ここにファイル名を書き込みます.*/

PROGRAM=Result         /*ここに実行ファイル名を書き込みます*/

CFLAGS                            = $(OPTIONS) $(EX_INCS)

$(PROGRAM):              $(OBJS)

                            rm -f $@

                            $(CC) -o $@ $(OBJS) $(CFLAGS) $(LDFLAGS) $(SYSLIB)

clean::

rm -f $(PROGRAM) *.o core *~ "#"* *.pgm

 

例題としてmain.c sub.cのファイルを書きます.

/********sub.cのファイル*********/

#include<stdio.h>

void sub(int A)

{

              printf("%d",A);

}

 

/*********main.cのファイル*********/

void sub(int A);

void main(void)

{

              int a;

sub(a);

}

 これをエディタに書き込み,main.c sub.cとしてセーブし,makefileの名前を指定する場所にmain.o sub.oと書き込み,実行ファイルの名前を指定して,ソースファイルがあるディレクトリ内において,コマンドライン上でmakeとして実行します.

するとコンパイル,リンクが実行され,間違いがなければ終了します.ここで初めてコンパイルを行なったのであれば,すべてのファイルについて.oファイルと実行ファイルが生成されます.

 ここでファイルの内容を修正してコンパイルすれば,修正したファイルについてのみ.oファイルが再生成され,修正されていないファイルは,以前の.oファイルを用いるのでコンパイルの実行時間の節約になります.ここですべての.oファイルを消すには,

make clean

と入力します.

 

5        まとめ

 

 今回は複数のファイルをコンパイルして実行させるための方法を記述した.makefile中に出てくる文字はマクロ機能と呼ばれるもので,makefileの汎用性を高めるためのものである.詳しい説明は以下の参考書を読んで下さい.

 

参考文献

UNIX  ツールハンドブック”エイチアイ=著 ナツメ社 1992

 

 

 

 

 

 

戻る