Makefile學習筆記
先列出一個很簡單的Makefile例子:
---------
hd.cpp
#include "hd.h"
using namespace std;
int main() {
cout << "hello, didier!1\n";
}
---------
hd.h
#include <iostream>
---------
Makefile //我們稱這個為Makefile1
hd : hd.cpp //注意,我沒寫hd.h
g++ -o hd hd.cpp
---------
make命令編譯,當然沒問題。但是注意,第一行我沒有用如下寫法:
hd : hd.cpp hd.h
所以Makefile1中,hd(可執行程序)不依賴于hd.h,只依賴于hd.cpp。編譯通過是因為在Makefile1中第二行調用g++時,編譯hd.cpp時會include "hd.h"。
這樣乍看沒問題,實際上有很大的問題,Makefile1中hd不依賴于hd.h,意思是說,如果這時候我修改hd.h,再make,make程序依然只檢測hd.cpp的版本,發現沒變化,所以不會調用第二行的g++命令。測試,果然如此。無論怎么修改hd.h,再次調用make是沒有動作的。
不要以為在.cpp中會include頭文件就可以不在Makefile中寫依賴.h文件。這樣得到的結論,或者說啟發,就是,在一個工程中會有很多的文件依賴關系,會有很多程序員參與編碼,如果修改了所依賴的文件,我們當然希望重新編譯,所以,不要偷懶,在Makefile中一定要寫全依賴關系。
比如這個例子,正確的寫法:
---------
Makefile //我們稱這個為Makefile2
hd : hd.cpp hd.h
g++ -o hd hd.cpp
---------
要搞清楚的是,Makefile2中,第一行所陳列的關系,就是希望make每次運行所要檢測的文件版本變化,第二行,是希望所要執行的命令。Makefile2的依賴關系很全,每次修改hd.h,make都會重新執行。
當然,如果不用make,直接在命令行中輸入調用g++,那么.h的修改當然會被重新編譯了。
最后總結,在Makefile的編寫中,每一個編譯文件一定要寫全其依賴關系,即使在cpp中會包含頭文件。