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