makefile中的通配符使用?
01-15
有下面的兩段代碼:
file1.o:file1.hfile2.o:file2.hmain.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和規則的依賴關係是這樣的,比如:
&決定&
&
推薦閱讀: