2013-05-01 96 views
0

app.cMakefile中有頭包括標題

#include "app.h" 

app.h

#include "model/world.h" 
#include "controller/controller.h" 

如何寫在makefile app.o的目標?我應該在前提條件中包含所有三個標題嗎?

回答

0

是的,你應該列出可能需要重新編譯app.o的app.c的所有依賴關係。

您可能會發現g ++ -MM app.c有用:-MM將以make格式列出app.c的所有依賴關係。你甚至可以使它自動化並讓你的makefile半自動處理依賴關係。

0
app.o : app.c app.h model/world.h controller/controller.h 
    gcc -c app.c 

是的,你需要包括所有三個頭作爲依賴。 Makefiles:如果:右側的任何內容已更改,則需要重新制作左側的內容。如果您在控制器中修復了一個錯誤,並從其中一個函數中刪除了三個參數,並且該應用程序會從該控制器調用該函數,那麼該應用程序需要重新編譯以處理更改。

否則當應用程序走到控制器並要求帶有5個參數的函數X時,新的和改進的控制器不會知道應用程序在說什麼。錯誤將被拋出。無處不在的血與火。這一切都以眼淚結束。

0

不,你不應該列出標題作爲依賴!這與已經以#include指令形式存在的規範是多餘的。並且冗餘通常會導致問題,因爲隨着項目的增長,最終會出現不一致的列表。

還有一個普遍的,雖然天真的誤解,只有頭文件是依賴關係。這可能會導致構建錯誤,因爲許多其他原因(如更改的命令行開關,更改的編譯器或更改的硬件體系結構)都會受到監控。

解決這兩個問題的方法是使用可靠的構建工具:makepp可以處理這些情況,甚至可以在啓動它時掃描包含甚至還沒有構建的包含文件中的子文件。

makepp還有很多。除了幾乎所有的GNU make功能之外,還有更多有用的東西,甚至可以用一些Perl編程擴展makefile。

+0

對於一個簡單的程序,自動依賴生成是矯枉過正的。您關心的命名依賴關係(例如,您可能修改的一個或兩個頭文件)就足夠了。 – 2013-05-01 17:34:12

+0

另一方面,這裏的例子建議使用多個目錄中的文件構建一個程序,其中包含其他標題的標題。手工維護這種複雜的依賴關係是痛苦和容易出錯的。 – 2013-05-01 17:37:16