2012-07-05 80 views
0

我正在通過Automatic Dependency Generationmake manual閱讀,我不明白爲什麼需要此功能。該項目是我的工作,我開始從頭開始編寫的結構是這樣的:自動依賴生成

  • 各單位(庫)有它自己的文件夾
  • 每個.cpp文件應包括具有相同的單個h文件名稱來自同一個目錄。好的,這個規則可能有點過於嚴格,就像循環依賴一樣,在這種情況下,我可能會包含另一個.h文件,正如下一個規則
  • 中所述,在.h文件中包含其他頭文件時,如果依賴關係位於另一個單元(庫)中,則總是使用相對於項目根目錄的路徑。否則,只需包含文件的名稱即可。

在makefile中,我將-I .傳遞給編譯器。當它遇到目錄X中的.cpp文件時,它將在同一目錄(或在.目錄中)中搜索.h文件。解析.h文件時,它將遇到包含相對於.文件夾的信息,因此它將知道在哪裏查找它們。

現在,如果代碼可以像我上面描述的那樣構造,那麼爲什麼有人要生成-M標誌的依賴關係列表,並將sed混亂以產生一個難以理解的.d文件(依賴關係)?我沒有看到從代碼文件生成特定的依賴關係列表。

回答

4

因爲實際上,每個源文件都依賴於多個頭文件。如果每次更改任何這些頭文件時都不重新編譯源文件,那麼很可能最終會得到不一致的二進制文件。

+0

哦,對了......我明白了。但在編譯.cpp文件之前,不會檢查整個依賴關係樹的更改嗎? – 2012-07-06 00:11:17

+1

@MihaiTodor:Make不知道你的依賴是什麼。所有Make可以做的是找出是否需要根據依賴關係的變化重新運行規則。您需要爲其提供每個目標的依賴列表。 – 2012-07-06 00:13:21

+0

你說得對。現在我明白了。非常感謝你! – 2012-07-06 00:19:33

1

這就是makepp的工作原理。自動檢測依賴關係。在你的情況下,你甚至不需要makefile(如果你不介意在命令中指定目標)。

內置的鏈接器規則具有自動推斷目標文件的功能。如果你說makepp proggie,它會掃描proggie.c(或.cpp或任何你有的)包含語句。對於每個語句,它會查看是否有可以構建的匹配.o文件,如果是,則遞歸掃描。所有以這種方式發現的.o文件都會被構建並鏈接在一起。

或者你的makefile可能是一個襯墊,以避免每次都指定目標:

$(phony all): proggie 
+0

感謝您的建議,但目前,我會堅持使用。 – 2012-07-08 19:49:10