Unixでプログラミングする人Makefileを知らない人はいないと思います。
非常にシンプルな例です:
Hello worldをコンパイルする三つのファイルが必要です:
void printhello();
#include"print.h"
#include<stdio.h>
void printhello(){
printf("Hello, world\n");
}
#include "print.h"
int main(void){
printhello();
return 0;
}
非常にシンプルなプログラムですが、コンパイルを成功させるにはどのようなステップが必要でしょうか
ここで理解する必要があるのは、二つのステップです:
- すべての *.cファイルからoファイルを生成する
- 各oファイルをリンクして、実行可能ファイルを生成する
一、makefileを書く:
makefileの作成は、ルールに基づいていますが、このルールも非常にシンプルです。
target : prerequisites //目標:前提条件
command //任意shellコマンド
例として
helloworld : main.o print.o # hellowordは目標とする
# main.o print.oは目標生成の前提条件
gcc -o helloworld main.o print.o # shellコマンド,前にtabが必要
main.o : main.c print.h
gcc -c main.c
print.o : print.c print.h
gcc -c print.c
clean :
rm -f helloworld main.o print.o
OK、makefile完成!
今、makeを入力すると自動的にgccが呼び出されてコンパイルされます。
make cleanを入力すると、helloworld、main.o、print.oが削除されます。
二、スキルーアップ!
上記の例で、main.oとprint.oが複数の場所で定義されていることに気がつくかもしれません。
C言語でマクロのように定義することができます:
objects = main.o print.o # 変数の宣言
helloworld : $(objects) # 宣言変数は$()の書き方
gcc -o helloworld $(objects)
main.o : main.c print.h
gcc -c main.c
print.o : print.c print.h
gcc -c print.c
clean :
rm -f helloworld $(objects)
これで変数を使用することで、プロジェクトでの便利さがアップ!
これ以上
各*.oファイルに対してgcc -c main.cと書くのは面倒じゃないですか
そして、main.cとprint.cはどちらもprint.hが必要ですが
これを改善すると:
objects = main.o print.o
helloworld : $(objects)
gcc -o helloworld$(objects)
$(objects) : print.h # print.hに依存
main.o : main.c # gcc -c main.cを削除、Gun makeで自動推論させる
print.o : print.c
clean :
rm -f helloworld $(objects)
これで完璧!