target... : prerequisites ...
command
......
解釋:
target : 是乙個目標檔案,也可以是執行檔案,還可以是乙個標籤(label)。
prerequisites :要生成那個target所需要的檔案或是目標。
command : make需要執行的命令。(任意的shell命令)
main : main.o run.o speak.o eat.o sleep.o
gcc -o main main.o run.o \
speak.o eat.o sleep.o
main.o: main.c
gcc -c main.c
run.o : run.c run.h
gcc -c run.c run.h
sleep.o : sleep.h sleep.c
gcc -c sleep.h sleep.c
eat.o : eat.h eat.c
gcc -c eat.c eat.h
speak.o : speak.h speak.c
gcc -c speak.h speak.c
clean :
-rm main.o run.o \
speak.o eat.o sleep.o main
反斜槓(\)是換行符的意思。這樣比較便於makefile的易讀。
一、在定義依賴關係後,後續的那一行定義了如何生成目標檔案的作業系統命令,一定要以乙個tab鍵作為開頭。
二、make會比較targets檔案和prerequisites檔案的修改日期,如果prerequisites檔案的日期要比targets檔案的日期要新,或者target不存在的話,那麼,make就會執行後續定義的命令。
三、clean不是乙個檔案,它只不過是乙個動作名字,有點像c語言中的lable一樣,其冒號後什麼也沒有,那麼,make就不會自動去找檔案的依賴性,也就不會自動執行其後所定義的命令。要執行其後的命令,就要在make命令後明顯得指出這個lable的名字。這樣的方法非常有用,我們可以在乙個makefile中定義不用的編譯或是和編譯無關的命令,比如程式的打包,程式的備份,等等。
對於.o檔案多次被使用,在makefile中以「$(objects)」的方式來使用這些變數
objects= main.o run.o \
speak.o eat.o sleep.o
main : $(objects)
gcc $(cflags) -o main $(objects)
main.o: main.c
gcc $(cflags) -c main.c
run.o : run.h run.c
gcc $(cflags) -c run.h run.c
sleep.o : sleep.h sleep.c
gcc $(cflags) -c sleep.h sleep.c
eat.o : eat.h eat.c
gcc $(cflags) -c eat.h eat.c
speak.o : speak.h speak.c
gcc $(cflags) -c speak.h speak.c
clean :
-rm $(objects) main
gnu的make很強大,它可以自動推導檔案以及檔案依賴關係後面的命令,於是我們就沒必要去在每乙個[.o]檔案後都寫上類似的命令,因為,我們的make會自動識別,並自己推導命令。
只要make看到乙個[.o]檔案,它就會自動的把[.c]檔案加在依賴關係中,如果make找到乙個whatever.o,那麼whatever.c,就會是whatever.o的依賴檔案。並且 cc -c whatever.c 也會被推導出來,於是,我們的makefile再也不用寫得這麼複雜。我們的是新的makefile又出爐了。
cflags = -wall
objects= main.o run.o \
speak.o eat.o sleep.o
main : $(objects)
gcc $(cflags) -o main $(objects)
eat.o main.o : eat.h
run.o main.o : run.h
speak.o main.o : speak.h
sleep.o main.o : sleep.h
.phony : clean
clean :
-rm $(objects) main
.phony : clean
clean :
-rm edit $(objects)
為了避免和檔案重名的這種情況,我們可以使用乙個特殊的標記「.phony」來顯示地指明乙個目標是「偽目標」,向make說明,不管是否有這個檔案,這個目標就是「偽目標」。
在rm命令前面加了乙個小減號的意思就是,也許某些檔案出現問題,但不要管,繼續做後面的事。當然,clean的規則不要放在檔案的開頭,不然,這就會變成make的預設目標,相信誰也不願意這樣。不成文的規矩是——「clean從來都是放在檔案的最後」。
Makefile教程 三 Makefile 總述
makefile裡主要包含了五個東西 顯式規則 隱晦規則 變數定義 檔案指示和注釋。顯式規則說明了,如何生成乙個或多的的目標檔案。這是由makefile的書寫者明顯指出,要生成的檔案,檔案的依賴檔案,生成的命令。由於我們的make有自動推導的功能,所以隱晦的規則可以讓我們比較粗糙地簡略地書寫make...
Makefile教程 六 MakeFile使用函式
一 if函式 if函式很像gnu的make所支援的條件語句 ifeq,if函式的語法是 if 或是 if 可見,if函式可以包含 else 部分,或是不含。即if函式的引數可以是兩個,也可以是三個。引數是if的表示式,如果其返回的為非空字串,那麼這個表示式就相當於返回真,於是,會被計算,否則會被計算...
Makefile簡易教程
在軟體開發中,make通常被視為一種軟體構建工具。該工具主要經由讀取一種名為 makefile 或 makefile 的檔案來實現軟體的自動化建構。它會通過一種被稱之為 target 概念來檢查相關檔案之間的依賴關係,這種依賴關係的檢查系統非常簡單,主要通過對比檔案的修改時間來實現。在大多數情況下,...