0.make、makefile是什么?
makefile定義了一系列的規則,來規定哪些部分先編譯,哪些部分后編譯,寫好makefile以后,只需一個make命令就可以讓整個工程完全自動編譯,所以簡單的說,make&makefile實現了大工程的自動化編譯。
1.makefile里是什么?
看個makefile的簡單例子:
1 target:main.o test.o 2 cc -o target main.o teat.o 3 main.o:main.c x.h 4 cc -c main.c 5 test.o:test.c y.h 6 cc -c test.c 7 clean: 8 rm target main.o test.o
可以看出,makefile中主要由兩個部分組成:#1文件依賴關系和#2生成所需命令。其中clean是一個偽目標文件,可用".PHONY:clean"在其前面注明。執行make命令即可編譯,執行make clean即可刪除所有目標文件。
2.make是如何工作的?
0)make會在當前目錄下找名字為"makefile "或"Makefile"的文件;
1)若找到makefile文件,接着找第一個目標文件(target),並把它作為最終的目標文件;
2)若target文件依賴后面的.o文件更新,則執行后面定義的命令會生成target文件;
3)某個.o文件也會依賴若干個源文件和頭文件,它們根據命令生成.o文件。
根據make的依賴性,make會一層層地去找文件的依賴性,直到最終第一個target文件被編譯成功。整個過程類似於數據結構中棧的操作。
3.特別注意——makefile中的變量賦值:
"="是最基本的賦值,makefile會將整個makefile展開后,再決定變量的值。
":="是覆蓋當前的值,其取決於當前的賦值,而不是最終的賦值(比較好判斷)。
"?="是若沒有被賦值過就賦等號后的值。
"+="是添加等號后的值。
4.可以利用變量減少重復,及利用makefile的自動推導簡化makefile,例如:
1 #Makefile 2 objects:main.o test.o 3 target:$(objects) 4 cc -o target $(objects) 5 main.o:x.h #這就用到了自動推導。 6 test.o:y.h 7 .PHONY:clean #說明clean是一個偽目標文件。 8 clean: 9 rm target $(objects)
因為這個編譯較簡單,優勢可能不太明顯,若要是大工程,變量和自動推導的使用會讓makefile有很大的簡化。這個部分其實還很豐富,先暫記到這。
5.小注:
0)makefile中命令必須以[tab]鍵開始。
1)若指定特定的makefile,可用"-f"和"--file"參數。
2)include,被包含的文件會被原封不動的放在當前文件包含的位置,如:
include foo.make
注意,不能以[tab]鍵開始。
簡單記錄了自己的筆記,對於錯誤和疏漏,歡迎賜教指正。關於make和makefile的更多內容,推薦陳皓的《跟我一起寫Makefile》和GNU Makefile手冊。