2

この質問について話しているのは、その人がタスクのメイクファイルで最終的な解決策を更新した場合です。それがどのように行われたかを理解するのに苦労しています。

ルールがあります:

$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c
    @$(CC) $(CFLAGS) -c $< -o $@

理解することはできませんが、直感的にそれが何をするかを知っています。他のほとんどすべてはかなり明確です。ありがとう!

4

2 に答える 2

3

これは静的パターンルールです。最初のフィールドはターゲットのリスト、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に自動的に実行させることができると仮定します。これは、おそらくまだ試行すべきではない高度な手法です。

于 2012-07-26T19:03:22.953 に答える
1

この行は、ソース (.c) からオブジェクト ファイル (.o) を取得する方法を説明しています。これにより、.c ファイルごとに行を繰り返す必要がなくなります。

オブジェクトは OBJDIR にあり、ソースは SRCDIR にあります。

$(CC) にはコンパイラが含まれ、CFLAGS にはコンパイラのオプションが含まれ、-c はソースをオブジェクトにコンパイルするよう gcc に指示します。

例えば:

  • CC = gcc

  • CFLAGS = -g -壁

gcc -g -Wall -c test.c -o test.o に変換できます

于 2012-07-26T16:59:02.290 に答える