標籤:

makefile中的通配符使用?

有下面的兩段代碼:

file1.o:file1.h

file2.o:file2.h

main.o:file1.h file2.h

第二段是

file1.o file2.o main.o: *.h

實現的效果一樣,但是有什麼具體的區別呢???

第二段的file1.o 沒有用到file2.h 為什麼不報錯???


題主要考慮make和g++兩個工具是平行的相互獨立的。(假定是使用g++)

makefile是給make看的,make看到file1.o:file1.h這句話就知道當file1.h比file1.o日期更新的話,需要重新編譯file1.o,所以make是決定需要編譯哪些內容,而如何編譯這些內容就是g++的工作了。

make判定需要重新編譯file1.o後,就會告訴g++「hi boy, can you recompile the file1.cpp?", 所以g++就開始編譯file1.cpp,這個時候g++預處理,編譯,彙編。預處理的時候根據include」xxx「決定使用哪些.h文件。

總之就是makefile中寫的.h是告訴make當該.h變化時,需要重新編譯哪些文件。

而make讓g++編譯這個文件的時候,g++是根據該文件#include "xxx.h"的東西來使用xxx.h的。

makefile中寫明依賴.h就是為了避免出現.h變化而cpp沒有重新編譯這種情況,如果工程大了,手工寫每個cpp的依賴.h簡直是XXXX,所以可以看這篇文章。http://blog.csdn.net/nightfallrove/article/details/2570077 一搜一大把


區別是,當你改了file2.h的時候,第一段的file1.o不會重新編譯而第二段會。當然你的代碼文件肯定很小,你不會覺得有什麼區別的。要是你像我一樣把超大的庫都壓縮成幾個幾萬行的cpp和h,你會發現不同的寫法有明顯的編譯時間上的區別。

至於為什麼不報錯,因為make根本就不管你文件是什麼內容,他只是用來執行命令的。其實一般的錯誤都是忘記加依賴導致有些h變化了cpp沒有編譯然後傻逼。


第一段你改動或者touch 一下file1.h後運行make,file1.o和main.o都會重新編譯,而file2.o不會。

touch 一下file2.h,file2.o和main.o會重新編譯而file1.o不會。

第二段 不論你touch哪個.h文件,這三個.o都會重新編譯。

makefile 的target和規則的依賴關係是這樣的,比如:

& : &

&

決定&是否執行只看這個,即make的時間性依賴條件

&集合裡面的文件的時間是否都比&集合里的文件時間要新,如果是,那麼rule不被執行,如果不是則執行。另外,1、當&中的文件不存在時,&會被執行。2、&為空時&也會被執行。3、&為虛目標(使用.PHONY進行了聲明)&也會被執行。

make不是gcc,他不會看你文件裡面具體寫的是什麼,他也不知道哪個.c依賴哪個.h,gcc才會知道你的.o裡面是否依賴了.h。make只看你的依賴條件和文件的時間。


推薦閱讀:

make makefile cmake qmake都是什麼,有什麼區別?

TAG:Unix | Makefile | make |