2011-09-19 19 views
0

我能做些什麼來解決這個問題?我是emacs,Unix和makefile的新手。請解釋我做錯了什麼,以及我如何解決它。我敢肯定,這是一個簡單的問題問題與我的簡短的Unix Makefile

progA: yesno.h yesno.cpp 
     g++ -DDEBUG -c yesno.cpp yesno.h 
progB: guess.cpp 
     g++ -DDEBUG -c guess.cpp 
progC: yesno.o guess.o 
     g++ -DDEBUG -o guess guess.o yesno.o 

我的錯誤是:

Your makefile does too much work when only guess.cpp has been changed: 
g++ -c yesno.cpp yesno.h 
g++ -c guess.cpp 
g++ -o guess guess.o yesno.o 

回答

2

你的Makefile會在每次重新編譯的一切。

你不需要前四行; make知道如何從源創建目標文件。或者,你需要這4條線修改爲2,並把他們在最後,並更改目標名稱:

guess: yesno.o guess.o 
     g++ -o guess yesno.o guess.o 
guess.o: yesno.h 
yesno.o: yesno.h 

的第一個目標是,在默認情況下建立的一個,這樣可以確保guess(該計劃)已建成。該命令行省略了-DDEBUG,因爲它隻影響源代碼編譯,並且該鏈接行中沒有源代碼(但是,如果在高級makefile中使用宏,我會很好地使用諸如-DDEBUG之類的選項出現在鏈接線)。

第三行說guess.o取決於yesno.h;這是一個猜測(就我而言)。 make程序已經知道如何將guess.cpp轉換爲guess.o;它只需要額外的信息,它也使用yesno.h標題。 (如果沒有,它是如何知道在yesno.cpp中定義的功能的?)

最後一行說yesno.o取決於yesno.h; make知道如何編輯yesno.cppyesno.o,但需要有關標題的額外信息。

這隻應該重新編譯guess.o當只有guess.cpp更改;當yesno.cpp改變時,它應該只重新編譯yesno.o;它應該在yesno.h更改時重新編譯這兩個對象文件。如果任何源文件發生更改,程序將重新鏈接;如果沒有源文件更改,那麼make命令應該什麼都不做(或者只是報告沒有任何事情要做)。

+0

非常感謝!問題解決了,也要感謝一個徹底的解釋。 – Sam