makefileはBashスクリプトのようなもので、オペレーティングシステムのコマンドも実行できます。makefileの利点は「自動コンパイル」です。一度作成すると、必要なmakeコマンドは1つだけで、プロジェクト全体が完全に自動的にコンパイルされるため、ソフトウェア開発の効率が大幅に向上します。
1ソースコードの例
sin_value.c
#include <stdio.h>
#include <math.h>
#define pi 3.14159
float angle;
void sin_value(void)
{
float value;
value = sin ( angle / 180. * pi );
printf ("\nThe Sin is: %5.2f\n",value);
}
cos_value.c
#include <stdio.h>
#include <math.h>
#define pi 3.14159
float angle;
void cos_value(void)
{
float value;
value = cos ( angle / 180. * pi );
printf ("The Cos is: %5.2f\n",value);
}
haha.c
#include <stdio.h>
int haha(char name[15])
{
printf ("\n\nHi, Dear %s, nice to meet you.", name);
}
main.c
#include <stdio.h>
#define pi 3.14159
char name[15];
float angle;
int main(void)
{
printf ("\n\nPlease input your name: ");
scanf ("%s", &name );
printf ("\nPlease enter the degree angle (ex> 90): " );
scanf ("%f", &angle );
haha( name );
sin_value( angle );
cos_value( angle );
}
4つのソースファイルを分析します。main.cは他の3つのファイルの関数を使用する必要があり、関数ファイルは数学ライブラリを使用します。
2手動で1つずつ操作します。
最初にgccを使用してコンパイルし、リンクして実行します。
1 4つの.cソースファイルをコンパイルし、対応する.oオブジェクトファイルを生成します。
gcc -c main.c haha.c sin_value.c cos_value.c
2再度リンクし、ライブラリディレクトリの追加に注意してください。
gcc -o main main.o haha.o sin_value.o cos_value.o -lm -L/usr/lib -L/lib
3テスト。
./main
Please input your name: xxpcb
Please enter the degree angle (ex> 90): 30
Hi, Dear xxpcb, nice to meet you.
The Sin is: 0.50
The Cos is: 0.87
3 makefile3.1を使用してmakefilevim makefile
を作成し、
次のようにファイルを編集します。
main: main.o haha.o sin_value.o cos_value.o
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
注:2行目の先頭のスペースが重要です。
3.2コンパイルされたmakefileを使用して
、以前に生成されたファイルをクリアする前にコンパイラを自動的にコンパイルしてから、makeコマンドを使用してコンパイルします。
rm -f main *.o
make
この時点で生成は完了しています。
3.3
効果を確認するには、makeで再度コンパイルしてみてください。
make
make: 'main' is up to date.
プログラムが変更されていないため、再コンパイルされておらず、更新操作のみが実行されていることがわかります。
4makefileの改善
4.1クリーン関数の追加
main: main.o haha.o sin_value.o cos_value.o
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
clean:
rm -f main main.o haha.o sin_value.o cos_value.
c
cc -c -o cos_value.o cos_value.c
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
4.2変数を使用してメイクファイルを簡素化する
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main: ${OBJS}
gcc -o $@ ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS}
注:makefileの変数の構文は、bashの構文とは少し異なります。makefile変数の基本的な構文は次のとおりです。
-
変数は=で区切られ、=の両側にスペースを入れることができます。
-
変数の左側にキースペースを含めることはできません
-
変数は通常大文字になります
-
$ {variables}や$(variables)などの変数を引用するには、中括弧または角かっこを使用します
- $ @は現在の目標を示します
4.3CFLAGS
コマンドライン入力について
例えば:
CFLAGS="-Wall" make clean main
- 追加 '
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
CFLAGS="-Wall"
main: ${OBJS}
gcc -o $@ ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS}
- シェルのデフォルト環境変数を使用する
コマンドラインで指定されたCFLAGSが最も優先度が高く、次にmakefileで指定されたCFLAGSが続きます。最初の2つでCFLAGSが指定されていない場合は、シェルのデフォルト環境変数が使用されます。
参考:「NiaogeのLinuxプライベートキッチン(基礎学習第3版)」