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の使い方
makefileはUNIX上で走るプログラムのようなもので,これを起動させるにはプログラムが存在するディレクトリ内に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