2012-08-24 30 views
4

雖然看着構建系統,但它們中的很多(SCons,bjam,cmake,Tundra等)都有一個內置的#include掃描器。然而gcc & icc提供-MMD(或-MD)選項,它輸出C++文件依賴的頭文件的名稱。「g ++ -MMD」比包含掃描更好嗎?

-MMD依賴項選項似乎是可靠的。如果將一個#include添加到C文件中,其時間戳將會更改,以便構建系統重新編譯它。如果您將一個#include添加到頭文件,它的時間戳會改變,它會重新編譯所有受影響的C文件。

包含掃描系統中斷,但-MMD在我看來是強健的。哪個最好,爲什麼?

回答

4

-MMD是最好的,因爲你給的原因和更多。

使編譯器輸出依賴關係作爲正常編譯過程的一部分,可確保編譯和找到依賴關係時,有一組完全相同的編譯器選項,例如-I路徑和宏。與確保爲兩個單獨的工具使用相同的選項相比,這種冗餘性較低且不易出錯。

+0

謝謝。你知道爲什麼所有這些工具都有#include掃描功能嗎? – ACyclic

+1

不是每個人都使用gcc(或icc),而舊版本的gcc只在'-MD'輸出中包含文件名而不是完整的路徑名,例如'foo.o:'而不是'dir1/dir2/foo.o' –

+1

MMD的一個小問題包括列表:當你#include 它會查看所有-I包括目錄。如果有兩個foo.h文件,它會讀取第一個文件。因此,如果您在搜索列表中的前面添加一個具有相同名稱的新頭文件,則依賴於-MMD將會中斷。 – ACyclic