相反
具有單個default
目標,做一切每個單獨的輸出應該是一個make目標的。這允許make正常工作,一次構建一件事,按照正確的順序(或者如果依賴關係圖允許的話,並行地)並且在每個步驟正確地報告錯誤。另外,非常重要的是,通過講述關於每個單獨目標以及它們依賴於的內容,確保當依賴性發生變化時,由於依賴性發生變化,make會準確知道需要重新構建哪些目標。這是Make的最佳功能。
在你的情況下,最終的目標是main
所以你想要的default
目標說main
構建,你要做的就是main
的先決條件:
default: main
現在你需要說如何建立main
,這取決於不同的目標文件,所以我們告訴作出這樣的:
main: main.o sample.o sample_2.o sample_3.o
這表示這取決於這些目標文件(它們是其prerequsites),所以他們會b首先建成。這些對象中的每一個都是另一個將單獨構建的製作目標。
當所有先決條件已建成配方將被用於將它們連接到main
,所以我們需要一個配方添加到上述目標:
main: main.o sample.o sample_2.o sample_3.o
g++ main.o sample.o sample_2.o sample_3.o -o main
製作有很多的縮寫來簡化事情,例如$(CXX)
是C++編譯器,[email protected]
意味着當前目標和$^
意味着當前目標的先決條件,這樣你就可以簡化規則:
main: main.o sample.o sample_2.o sample_3.o
$(CXX) $^ -o [email protected]
這實際上是你所需要的,讓已經知道如何使用來構建.o
先決條件它的內置規則,所以它會看到一個名爲main.cpp
的文件,並且知道它可以編譯創建main.o
,並參見sample.cpp
並將其編譯爲sample.o
等。它將從makefile創建一個依賴關係圖來決定需要哪些目標以便建立default
(這意味着它決定需要main
,需要main.o
,sample.o
等,他們需要main.cpp
和sample.cpp
等,這些已經存在,所以它可以開始建設的先決條件,直到它必須然後鏈接main
所需要的一切就可以做到這一點,光潔度。)
現在,如果你改變sample_2.cpp
和再次運行make
會看到sample_2.o
已過期,需要重新編譯,但其他.o
文件還行(它們是新的,然後它們所依賴的.cpp
文件),因此它會重新編譯sample_2.o
和重新鏈接main
而不是重建一切。
事實上,你甚至可以進一步簡化它,使用默認的配方鏈接對象成可執行:
LINK.o = $(CXX)
default: main
main: main.o sample.o sample_2.o sample_3.o
這就是你所需要的!但是,對於初學者來說,通常會更清晰地使用更詳細的版本,因爲當您不熟悉Make的所有自動規則和變量時,定製更容易。
告訴make有關頭文件的依賴關係也很有幫助,這樣當頭文件發生變化時,事情就會重建。這可以使用編譯器自動完成,以生成先決條件,但對於簡單的情況,您可以直接將其添加到makefile中,例如,
sample.o: sample.hpp sample.cpp
閱讀gcc手冊和make手冊。至少,學習如何在沒有make的情況下實現你想要的shell。 –
如果您的'make'甚至不執行,請重新安裝它。 – EJP