規則(Rules):一個Makefile檔案由一條一條的規則構成,一條規則結構如下
target … (目標): prerequisites …(依賴) recipe(方法) … …
最簡單的Makefile
hello: hello.cpp g++ hello.cpp -o hello # 開頭必須為一個Tab,不能為空格
但通常需要將編譯與連結分開寫,分為如下兩步
hello: hello.o g++ hello.o -o hello hello.o: hello.cpp g++ -c hello.cpp
Makefile檔案的命名與指定
Make會自動查詢makefile檔案,查詢順序為GNUmakefile -> makefile -> Makefile
GNUmakefile:不建議使用,因為只有GNU make會識別,其他版本的make(如BSD make, Windows nmake等)不會識別,如果只給GNU make使用的情況
makefile:可以使用,GNU make和其他版本make識別
Makefile:最常用,強烈建議使用
如果執行make的時候沒有找到以上名字的檔案,則會報錯,這時候可以手動指定檔名
make -f mkfile # make -f <filename>
make --file=mkfile # make --file=<filename>
手動指定之後,make就會使用指定的檔案,即使有Makefile或者makefile不會再自動使用
Makefile檔案內容組成
一個Makefile檔案通常由五種型別的內容組成:顯式規則、隱式規則、變數定義、指令和註釋
顯式規則(explicit rules):顯式指明何時以及如何生成或更新目標檔案,顯式規則包括目標、依賴和更新方法三個部分
隱式規則(implicit rules):根據檔案自動推導如何從依賴生成或更新目標檔案。
變數定義(variable definitions):定議變數並指定值,值都是字串,類似C語言中的宏定義(#define),在使用時將值展開到引用位置
指令(directives):在make讀取Makefile的過程中做一些特別的操作,包括:
-
讀取(包含)另一個makefile檔案(類似C語言中的#include)
-
確定是否使用或略過makefile檔案中的一部分內容(類似C語言中的#if)
-
定義多行變數
註釋(comments):一行當中 # 後面的內容都是註釋,不會被make執行。make當中只有單行註釋。如果需要用到#而不是註釋,用\#。
檢視原始檔的依賴檔案
g++ -MM main.cpp