この質問について話しているのは、その人がタスクのメイクファイルで最終的な解決策を更新した場合です。それがどのように行われたかを理解するのに苦労しています。
ルールがあります:
$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c
@$(CC) $(CFLAGS) -c $< -o $@
理解することはできませんが、直感的にそれが何をするかを知っています。他のほとんどすべてはかなり明確です。ありがとう!
これは静的パターンルールです。最初のフィールドはターゲットのリスト、2番目はMakeがターゲットの「ステム」を分離するために使用するターゲットパターン、3番目はMakeが前提条件のリストを作成するために使用する前提条件パターンです。
あなたが持っているとしましょう
SRCDIR = src
OBJDIR = obj
OBJECTS = obj/foo.o obj/bar.o obj/baz.o
$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c
@$(CC) $(CFLAGS) -c $< -o $@
の場合make obj/foo.o
、Makeは最初にこのルールを使用するルールとして識別し(obj/foo.o
ターゲットリストにあるため$(OBJECTS)
)、それをターゲットパターンobj/%.o
と照合し、ステム(ワイルドカードと一致する部分%
)がfoo
であることを確認してから、それを前提条件パターンにプラグインしますsrc/%.c
そして、前提条件がであることがわかりsrc/foo.c
ます。
変数も定義した場合
CC = gcc
CFLAGS = -thisflag -thatflag=something
次に、ルールのコマンドは次のようになります
@gcc -thisflag -thatflag=something -c src/foo.c -o obj/foo.o
(これ$<
が最初の前提条件で$@
あり、ターゲット名であることに注意してください。)
他の質問への回答:はい、makefileはヘッダーファイル()への依存関係を処理できるx.h
ため、ヘッダーが変更された場合、Makeはターゲットを再構築します。いいえ、このmakefileはそれを行いません。makefileを手動で変更し、次のようなルールを追加できます。
a.o: x.h
インクルージョンが実際に何であるかを知っているか、makefileに自動的に実行させることができると仮定します。これは、おそらくまだ試行すべきではない高度な手法です。
この行は、ソース (.c) からオブジェクト ファイル (.o) を取得する方法を説明しています。これにより、.c ファイルごとに行を繰り返す必要がなくなります。
オブジェクトは OBJDIR にあり、ソースは SRCDIR にあります。
$(CC) にはコンパイラが含まれ、CFLAGS にはコンパイラのオプションが含まれ、-c はソースをオブジェクトにコンパイルするよう gcc に指示します。
例えば:
CC = gcc
CFLAGS = -g -壁
gcc -g -Wall -c test.c -o test.o に変換できます