基本規則:
目標:依賴
(tab)規則
?
目標:需要生成的目標文件
依賴:生成該目標所需的一些文件
規則:由依賴文件生成目標文件的手段
tab:每條規則前必須以tab開頭,使用空格不行。?
?
例如:
/** test.c **/ #include<stdio.h> int main() {printf(“this is test\n”);return 0; }
終端編譯就是:gcc test.c -o test?
換成Makefile文件就是
test:test.cgcc test.c -o test
其中第一行的test就是要生成的目標,test.c 就是依賴項,第二項就是由test.c生成的test的規則。
?
Makefile可以生成多個目標,但是Makefile會將第一個目標定為終極目標。
?
普通變量:
變量定義以及賦值:
變量直接采用賦值的方法即可完成定義;如:
INCLUDE = ./include/
變量取值:
用括號括起來再加一個美元符,如:
FOO = $(OBJ)
?
系統自帶變量:
通常都是大寫,比如CC,PWD,CFLAG,等等。
有些有默認值,有些則沒有,比如:
?
CPPFLAGS:預處理器需要的選項 如:-I
CFLAGS:編譯的時候使用參數 -Wall -g -c
LDFLAGS:鏈接庫使用的選項 -L -I
變量的默認值可以被修改,比如CC的默認值是cc,但是可以修改為CC = gcc
?
自動變量:
常用的自動變量:
系統提供了很多自動變量,但常用的就是與以下三個,這些自動變量只能在規則中使用,其他地方不能使用。
$@ à規則中的目標
$< à規則中的第一個依賴項
$^ à規則中所有的依賴性
?
例如:
app:main.c fun1.c fun2.cgcc $^ -o $@
其中:$^表示main.c fun1.c fun2.c,$< 表示main.c , $@ 表示app
?
模式規則:
模式規則是在目標及依賴條件中使用%來匹配對應的文件,比如在目錄下有main.c,fun1.c,fun2.c 三個文件,對這三個文件的編譯可以由一條規則完成。
%.o : %.c$(CC) -c $< -o $@
這條模式規則表示:
main.o 由main.c 生成
fun1.o 由fun1.c 生成
fun2.o 由fun2.c 生成
?
這就是模式規則的作用,可以一次匹配目錄下所有的文件。
?
函數:
makefile也為我們提供了大量的函數,同樣經常使用到的函數為以下兩個。
?
wildcard:
用于查找指定目錄下指定類型的文件,跟的參數就是目錄+文件類型,比如:
src = $(wildcard ./src/*.c)
?
這句話表示,找到./src目錄下的所有文件后綴為.c的文件,并賦值給變量src
命令執行完畢后,src的值就是main.c fun1.c fun2.c
?
patsubst
匹配替換,例如以下例子,用于從src目錄中找到所有的.c結尾的文件,并將其替換為.o文件,并賦值給obj
obj = $(patsubst %.c , %.o ,$(src))
將src變量中所有后綴為.c文件替換成.o
命令執行完成后,obj的值為main.o fun1.o fun2.o
特別的,如果想把.o文件放在obj目錄下,可以用以下方法:
ob = $(patsubst ./src/%.c, ./obj/%.o, $(src))
?
makefile文件中所有的函數都必須有返回值。
?
#make all 執行生成可執行文件
#1編譯器 2編譯選項 3輸出 4生成的可執行文件 5需要的源文件 6需要當庫文件
?