Nanashi-softプログラマ専用Windows gcc SDL


◇Windowsでgcc+SDL -Makefileを記述する-

makeを実行すると、更新されたファイルだけコンパイルし直す事ができます
ソースファイルが膨大になった際に威力を発揮します

Makefileを記述する前の大前提として、1ディレクトリ(フォルダ)1ソフトです
UNIXコマンドを知らなくても、エクスプローラからフォルダを作成すれば直ちに反映されます
cdコマンドで、作成したフォルダに移動して下さい

例)testディレクトリを作る

$ mkdir test


例)testディレクトリに移動する

$ cd test

例)1つ上のディレクトリに移動する(元のディレクトリに戻る)

$ cd ..

○記述の基本

・Makefileというファイル名にする
・先頭に#を付けるとコメントになる
・1行1意味が徹底されており、改行の際には最後に\を記述して、必ず先頭にTABを付けなければならない
・変数名=内容、で変数を宣言して、$(変数名)で使用する
・改行コードはLFのみ

○コマンドを置き換える

よく使うgcc+SDLのビルドコマンド

gcc -msse2 -O2 -o test testsrc1.c testsrc2.c `sdl-config --cflags --libs`

をMakefileに記述してみます

このコマンドは、コンパイルとリンクを一気に行っています
これをコンパイルとリンクを順に行うように書き換えます

コンパイルコマンド

gcc -msse2 -O2 testsrc1.c `sdl-config --libs`
gcc -msse2 -O2 testsrc2.c `sdl-config --libs`

リンクコマンド

gcc -o test testsrc1.o testsrc2.o `sdl-config --libs`

こうする事で、更新されたソースだけを再コンパイルして、リンクすれば良い状態になります

○変数定義

変数名は、原則として大英文字で、勝手に付けてよいです
=の後ろに値をそのまま書きます
数値や文字といった違いは無く、全部文字列ですので、かっこでくくるといった必要もありません
変数名 = 代入する値
と書くだけです

まずは、コマンドを変数に定義します

CC		= gcc

PS3 Linuxを触っている人は良く分かると思いますが、コンパイラコマンドは環境によって異なりますので、変数にする意味があります

次に、コンパイルオプションとリンクオプションをそれぞれ変数定義します

CFLAGS	= -msse2 -O2 `sdl-config --cflags`
LIBS	= `sdl-config --libs`

SSE2オプションは更に別変数にしても良いですね

出力プログラム名を変数定義

TARGET	= test

中間ファイルであるオブジェクトファイル名を変数定義

OBJS	= testsrc1.o testsrc2.o

ファイル名の間は半角スペースで区切るルールです

OBJS	= testsrc1.o \
			testsrc2.o

改行を行いたい時は、半角スペース¥を行末に記述して、次の行の先頭は必ず TABというルールです
上で書いた通り、1行1意味が原則のスクリプトですので、このような制約があります

○コンパイル

コンパイル記述は、.c.o:、そして次の行にコマンドです

.c.o:
$(CC) $(CFLAGS) -c $<

改行後の先頭はTABで始まります
この .c.oと言うのは、内部定義されているもので、C言語ファイルをコンパイルする時の定数だと思って下さい。故に『C言語ソースのファイル名は必ず○○.cでなければなりません
最後の「$<」は、ディレクトリ内にある該当拡張子のファイル全てを意味します

変数を元に戻して書いてみると、コンパイルコマンドになります

○リンク

リンク記述は、実行ファイル名:オブジェクトファイル名郡、次の行にリンクコマンドです

$(TARGET):	$(OBJS)
	$(CC) -o $(TARGET) $(OBJS) $(LIBS)

しつこいようですが、改行後の先頭はTABで始まります

これも変数を元に戻して書いてみると、リンクコマンドになります

○依存関係

コンパイルする為に必要なファイルを記述します

testsrc1.o: testsrc1.h
testsrc2.o: testsrc2.h

このように記述しておくことで、ヘッダーを更新した際に、それを使用しているソースが再コンパイルされます

○オプション定義

makeコマンド実行時にオプションを付けた時の動作を定義できます
例えば、全ソースをコンパイルし直す cleanオプションを定義してみます

clean:
	rm -f *.o

これで make cleanとコマンドを発行すると、オブジェクトファイルが全て消去されます

○コマンド実行

ソースと同一ディレクトリに Makefileを入れて、makeコマンドを実行するとビルドできます
その際にソースファイルが更新されていないものはコンパイルせずにリンクだけ行われます

全体をコンパイルし直したい場合は、定義したオプションを使用して make cleanコマンドを実行してから、makeコマンドを実行する事で可能です

○Makefileの中身

CC		= gcc
CFLAGS	= -msse2 -O2 `sdl-config --cflags`
LIBS	= `sdl-config --libs`
TARGET	= test
OBJS	= testsrc1.o testsrc2.o

$(TARGET):	$(OBJS)
	$(CC) -o $(TARGET) $(OBJS) $(LIBS)

clean:
	rm -f *.o

.c.o:
	$(CC) $(CFLAGS) -c $<

testsrc1.o: testsrc1.h
testsrc2.o: testsrc2.h



TOPプログラマ専用Windows gcc SDL