2
$(OBJDIR)/NetStats.o: ../../../source/network/NetStats.cpp $(GCH) | prebuild
    $(CXX) $(CXXFLAGS) -MF $(OBJDIR)/NetStats.d -MT "$@" -o "$@" -c "$<"

NetStats.oはオブジェクトに依存し3ますが、最初のもの ( $<) のみがコンパイルに関与します。その根拠は何ですか?

そして、-MF -MT とはどういう意味ですか?

4

2 に答える 2

2

初め、

 -MF $(OBJDIR)/NetStats.d

依存ファイルを生成し、ヘッダーで何かが変更された場合にソースの自動再構築を可能にします。

したがって、NetStats.cpp が変更された場合、NetStats.o に依存するターゲットで make を実行するとすぐに再構築されます。

次に、GCC ドキュメントから:

 -MT target

依存関係の生成によって発行されるルールのターゲットを変更します。デフォルトでは、CPP はパスを含むメイン入力ファイルの名前を取得し、`.c' などのファイル サフィックスを削除し、プラットフォームの通常のオブジェクト サフィックスを追加します。結果が目標です。

-MT オプションは、指定した文字列とまったく同じになるようにターゲットを設定します。複数のターゲットが必要な場合は、それらを -MT の単一の引数として指定するか、複数の -MT オプションを使用できます。

たとえば、-MT '$(objpfx)foo.o' は $(objpfx)foo.o: foo.c を与える可能性があります。


.d ファイルは、makefile の一部のように見えます。これは、私のプロジェクトの 1 つの Canvas.d からの抜粋です。

 Out/Mac/ppc64/Obj/Canvas.o: Src/Linderdaum/Renderer/Canvas.cpp \
     Src/Linderdaum/Renderer/Canvas.h Src/Linderdaum/Core/iObject.h \
    /usr/include/c++/4.0.0/deque /usr/include/c++/4.0.0/bits/functexcept.h \
    /usr/include/c++/4.0.0/exception_defines.h \
    .....

基本的に、プリプロセッサは .cpp ファイル内のすべての依存関係を検索し、これらの依存関係を指定する追加のターゲットを生成します。

.d ファイルが実際に何であるかを確認するには、test.c を記述してみてください。

 #include <stdio.h>
 #include <stdlib.h>
 int main() { return 0; }

gcc -MD -c test.c コマンドを実行します

私のMingW環境では

test.o: test.c \
 c:\eqmingw\bin\../lib/gcc/x86_64-w64-mingw32/4.6.0/../../../../x86_64-w64-mingw32/include/stdio.h \
 c:\eqmingw\bin\../lib/gcc/x86_64-w64-mingw32/4.6.0/../../../../x86_64-w64-mingw32/include/_mingw.h \
 c:\eqmingw\bin\../lib/gcc/x86_64-w64-mingw32/4.6.0/../../../../x86_64-w64-mingw32/include/_mingw_mac.h \
 c:\eqmingw\bin\../lib/gcc/x86_64-w64-mingw32/4.6.0/../../../../x86_64-w64-mingw32/include/vadefs.h \
 c:\eqmingw\bin\../lib/gcc/x86_64-w64-mingw32/4.6.0/../../../../x86_64-w64-mingw32/include/sdks/_mingw_directx.h \
 c:\eqmingw\bin\../lib/gcc/x86_64-w64-mingw32/4.6.0/../../../../x86_64-w64-mingw32/include/sdks/_mingw_ddk.h \
 c:\eqmingw\bin\../lib/gcc/x86_64-w64-mingw32/4.6.0/../../../../x86_64-w64-mingw32/include/_mingw_print_push.h \
 c:\eqmingw\bin\../lib/gcc/x86_64-w64-mingw32/4.6.0/../../../../x86_64-w64-mingw32/include/sec_api/stdio_s.h \
 c:\eqmingw\bin\../lib/gcc/x86_64-w64-mingw32/4.6.0/../../../../x86_64-w64-mingw32/include/_mingw_print_pop.h \
 c:\eqmingw\bin\../lib/gcc/x86_64-w64-mingw32/4.6.0/../../../../x86_64-w64-mingw32/include/stdlib.h \
 c:\eqmingw\bin\../lib/gcc/x86_64-w64-mingw32/4.6.0/include-fixed/limits.h \
 c:\eqmingw\bin\../lib/gcc/x86_64-w64-mingw32/4.6.0/include-fixed/syslimits.h \
 c:\eqmingw\bin\../lib/gcc/x86_64-w64-mingw32/4.6.0/../../../../x86_64-w64-mingw32/include/limits.h \
 c:\eqmingw\bin\../lib/gcc/x86_64-w64-mingw32/4.6.0/../../../../x86_64-w64-mingw32/include/sec_api/stdlib_s.h \
 c:\eqmingw\bin\../lib/gcc/x86_64-w64-mingw32/4.6.0/../../../../x86_64-w64-mingw32/include/malloc.h

システム インクルード ファイルを依存関係リストから除外するには、-MM スイッチを使用することもできます。

于 2012-05-15T11:35:36.050 に答える
1

多くの場合、オブジェクト ファイルは、コンパイルしなければならないものよりも多くのものに依存する場合があります。古典的な例:

myprog.o: myprog.c header1.h header2.h
    gcc -c -o myprog.o myprog.c

その場合、ヘッダーをコンパイル行に渡さず、ソースを処理するときにコンパイラー自体によって取り込まれます。

ただし、含まれているヘッダーが変更された場合は再コンパイルする必要があるため、依存関係は引き続き必要です。myprog.c

于 2012-05-15T11:36:51.510 に答える