コンパイルする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」プログラムの構築に引き続き使用できます)。
答え2
適切なMakefileを生成するには、次の2つの要件を満たす必要があります。
- マクロ
- ルール
Makefileのマクロを使用して構文を短縮し、ファイル変更時に編集を簡単にします。たとえば、
C = gcc # sets the macro for the C compiler to C
だから$(C)
交換が可能です。gcc
ルールは、ファイルとその依存関係に対する変更を確認するために使用されます。常に実行all
時に最初に確認されるルールが必要です。 Cプログラムと同様に、関数が最初に実行されます。make
all
main()
メイクファイルの例:
C = gcc
CFLAGS = -o
INPUT = hello
OUT = $(INPUT)
all: $(INPUT)
$(OUT): $(INPUT).c
$(C) $(INPUT).cpp $(CFLAGS) $(OUT)
ルールは名前+セミコロン(例do_this:
:)を提供し、その後に依存ファイルまたはルールを追加した後(例:another_rule $(DEPENDANDTFILE)
)TABの次の行にコマンドを追加することで宣言できます。
注:ステートメント行の先頭にTABがないと、ルールは機能しません。