1

ここで、このチュートリアルはそれを非常に美しく説明しており、ほとんどはうまく機能します。以下は、次のようなディレクトリ構造があることを前提としたチュートリアルの最終的な Makefile です。

root-----Makefile
   |-----All source files here.

コンパイルの結果はrootディレクトリにあります。以下は Makefile です。

OBJS := foo.o bar.o

# link
proggie: $(OBJS)
    gcc $(OBJS) -o proggie

# pull in dependency info for *existing* .o files
-include $(OBJS:.o=.d)  #NOTE THIS

%.o: %.c   #NOTE THIS
    gcc -c $(CFLAGS) $*.c -o $*.o
    gcc -MM $(CFLAGS) $*.c > $*.d
    @cp -f $*.d $*.d.tmp
@sed -e 's/.*://' -e 's/\\$$//' < $*.d.tmp | fmt -1 | \
  sed -e 's/^ *//' -e 's/$$/:/' >> $*.d
@rm -f $*.d.tmp
# remove compilation products
clean:
    rm -f proggie *.o *.dOBJS := foo.o bar.o

チュートリアルで1つだけわからないことがあります。それはpull in dependency info for *existing* .o files、対応する.dファイルが作成されますが、まだ残っているターゲットの依存関係リストに変更が加えられていないため、これらはどのように処理されますか%.o: %.c

実際、私が気づいたことから、それは私にはうまくいきません。ここで何が起こっているのか誰でも説明できますか。.dこのチュートリアルが間違っている場合 (私は非常に疑いがあります)、ファイルから依存関係を依存関係リストに含める方法について言及してください。

4

1 に答える 1

1

で作成された依存関係ファイルにgcc MMは、次のようなルールが含まれます。

foo.o: stdio.h myinc.h # ...

この行には、リスト内の各オブジェクトの依存関係ファイルが含まれています。

-include $(OBJS:.o=.d)

たとえば、foo.d を見てください。

これによると

1 つのファイルを複数のルールのターゲットにすることができます。すべてのルールで言及されているすべての前提条件は、ターゲットの前提条件の 1 つのリストにマージされます。ターゲットがルールの前提条件よりも古い場合、レシピが実行されます。

したがって、ルールがある場合でも%.o: %.c、 include ステートメントは、このルールを依存関係で展開するルールをインポートします。

于 2013-05-19T21:31:57.223 に答える