コンパイルするMakefileを作成する方法を知りたいですhello.c
。
// for example
int main(int argc, char *argv[]) {
puts("Hello world");
return 0;
}
私は助けを借りてプログラムをコンパイルして実行したことを知っていますが、gcc hello.c -o hello
それが今まで私が知っているすべてです。
ベストアンサー1
GNU makeには非常に重要な機能があります。オンラインマニュアル, 私の考えにはいろんな面で迷惑で鈍感ですが良い参考資料になります。他の人が言ったように、自分に合ったチュートリアルを見つけて、マニュアルを参照して設定方法などについて理解してください。
ビルド用のデフォルト(GNU make)makefileはhello.c
次のとおりです。
CFLAGS += -Wall -g -O0
PROGS = hello
.PHONY: clean
%: %.c
$(CC) $(CFLAGS) $< -o $@
clean:
-rm $(PROGS)
$(CC)
は組み込み変数;オーバーライドしない場合、デフォルト値はでcc
、GNUシステムではシンボリックリンクになりますgcc
。 %
を表すパターンルール; この場合は一致します。何もないしかし、ディレクトリにない場合、レシピはanything.c
失敗します。 $<
そして$@
自動変数。したがって、今実行すると:
make hello
Makeは以下を実行します。
cc -Wall -g -O0 hello.c -o hello
`$(CFLAGS) と一緒に使うと、+=
次のことができます。
CFLAGS="--std=c99" make hello
したがって、スペースで区切ってに追加-Wall -g -O0
されます。--std=c99
参考make CFLAGS="--std=c99" hello
にしてお使いください変えるmakefile のすべての定義。
ルールは3つの基本部分で構成されています。ターゲット、これ前提条件、しかもレシピ(ねえ)。このルールは、次の状況で実行されます。
- 宛先ファイルが存在しません。
- ターゲットファイルが前提条件の1つより古い。
.PHONY
それにもかかわらず、ターゲットは実行されます。したがって、make clean
上記のmakeファイルを使用して実行すると、次のことが実行されます。
rm hello
この場合、$(PROGS)
他の場所では使用されませんが、より複雑なプロジェクトの make files では、他のタスクの前提条件として使用できます。たとえば、このルールを一番上(変数宣言の後)に追加すると、次のようになります。
all: $(PROGS)
リストに追加すると、すぐに入力できるようall
に.PHONY:
なり、make
リスト内のすべてのエントリはその$(PROGS)
ルールを使用して作成されます%: %.c
。これはmakeの前提条件でall
あり、all
ファイルの最初の規則であるためです。指定しないと、デフォルトで使用されます(つまり、make hello
「hello」プログラムの構築に引き続き使用できます)。