ソフトウェア設計及び演習2017

簡単な make コマンドの使い方

Makefile

コンパイル法を Makefile という名前のファイルに書いておき,make コマンドを実行することで,あとは自動的に必要なファイルをコンパイル,リンクしてくれます.

Makefile の例

 1:# Makefile
 2:
 3:OBJS = foo.o bar.o baz.o
 4:LDLIBS = -lm -L/usr/X11R6/lib/ -lX11
 5:
 6:foo: $(OBJS)
 7:        gcc -o foo $(OBJS) $(LDLIBS)
 8:
 9:foo.o: foo.c foo.h
10:	   gcc -gc foo.c
11:
12:bar.o: bar.c foo.h
13:        gcc -gc bar.c

# で始まる行はコメント.

3行目は,OBJSという変数の値を,foo.o bar.o baz.o に設定.これはオブジェクトファイルの名前.

4行目も変数の設定で,ライブラリを指定するため.

6行目は,foo.o というファイルは,foo.c とfoo.h という二つのファイルから作ることを意味しています.

の左側の foo をターゲット, 左側を依存リストと呼びます.

7行目は,foo.oを作るためのコマンドを書いています.この行の最初の文字は,タブでなければいけません. $(OBJS) と $(LDLIBS) は,変数の中身をここに埋め込む意味です.埋め込まれた結果は,

   gcc -o foo foo.o bar.o baz.o -lm -L/usr/X11R6/lib/ -lX11

となり,これがコマンドとなります.

このコマンドが実行されるのは,ターゲットファイルがが依存リスト中のファイルより古い日付の時に限ります.

一度fooができていて,foo.c や foo.h が修正されていなければ,makeを実行してもコンパイル・リンクは行われません.ソースを修正していなければ,実行プログラムの変更はないはずですよね.

9行目は foo.o という(オブジェクト)ファイルは,foo.c とfoo.h の二つの(ソース)ファイルから作られるという意味.

10行目は, foo.o を作るためのコマンドです. -g は後のデバッグ用に,情報(シンボルテーブル)を保存する意味. -c はコンパイルのみ実行し,リンクはしない意味です.

make に関連して,ファイルの修正時間を更新するコマンドがあります.

    % touch foo.c

とすると foo.c の修正時間をtouch コマンドを実行した時間にしてくれます.


最終更新日:2017/04/03 09:14:24