2012-05-15 82 views

回答

2

首先,

-MF $(OBJDIR)/NetStats.d 

生成依賴文件這然後允許的來源自動重建某些東西在報頭改變。

所以,它的NetStats.cpp改變,它將盡快運行make與取決於NetStats.o

二的目標,從GCC文檔重建:

-MT target 

更改由依賴關係生成發出的規則的目標。默認情況下,CPP採用主輸入文件的名稱(包括任何路徑),刪除任何文件後綴(如「.c」),並附加平臺的通常對象後綴。結果是目標。

-MT選項會將目標設置爲您指定的字符串。如果您需要多個目標,則可以將它們指定爲-MT的單個參數,或使用多個-MT選項。

例如,-MT '$(objpfx)foo.o的' 可能給 $(objpfx)foo.o的:foo.c的


.d文件看起來就像生成文件的一部分。下面是從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文件真的是一個可以嘗試寫有test1.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開關。

+0

NetStats.d如何工作? –

+0

添加了對答案的解釋。基本上,它是一個「minitarget」 –

1

通常情況下,目標文件可能依賴於比編譯更多的東西。經典範例:

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

在這種情況下,你不給的頭到編譯線,它們是由編譯器本身處理源時買英寸

但是你仍然想要依賴關係,因爲如果myprog.c包含的任何頭被改變,你想重新編譯。