前言:沒接觸Linux下編譯以前,以爲很神祕,特別是makefile,一個簡單的make命令就能編譯一個大型項目生成一個可執行文件,接下來跟你們分享下學習的makefile的知識。shell
目錄:函數
1.makefile簡介工具
2.makefile規則學習
3.makefile隱晦規則ui
4.makefile僞目標文檔
5.makefile變量get
6.makefile條件控制語句it
7.makefile文件引用編譯
8.makefile函數編譯原理
9.makefile註釋,換行,-f
10.makefile動手實踐
1.makefile簡介
首先,咱們一般使用的make都是gnu make,也就是一種解析makefile的make工具,關於gnu和Linux還有一段鮮爲人知的故事,你們能夠本身查下。makefile就是一個文檔,make工具經過解析這個文檔,把一個個.c .cpp文件經過gcc/g++命令編譯成.o(臨時文件 Object file),再經過gcc/g++命令編譯成一個二進制的可執行文件,也能夠將.o文件連接成一個.a(靜態連接庫,Windows下爲.lib)。
2.makefile規則
makefile接觸最多的一個詞就是目標,它能夠是一個可執行文件,.o,僞目標。makefile編譯就是把最終生成的可執行文件這個目標,依賴其餘的目標,一層層依賴,最終依賴到.c,.cpp文件。另外,make編譯的時候當發現目標所依賴的目標發生變化的時候,纔會從新編譯,節省了編譯時間。makefile目標依賴以下,此處很關鍵:
target : prerequisites
command
...
**提示:cmmand前面是一個tab
示例:
main : main.o
cc -o edit main.o
main.o : main.c main.h
cc -c main.c
3.makefile隱晦規則
#原文件
main : main.o
cc -o edit main.o
main.o : main.c main.h
cc -c main.c
#變一下
main : main.o
cc -o edit main.o
main.o : main.c main.h
#再變一下
main : main.o
cc -o edit main.o
main.o : main.h
#隱晦規則:編譯工具gcc會自動搜索main.o同目錄的同名.c文件,即main.c,即自動推導。
固然還有不少其餘的隱晦規則,就不一一列舉。
4.makefile僞目標
常見僞目標all,clean..這些僞目標不會生成文件,主要是爲了執行一些命令。
.PHONY : clean
clean :
rm -f *.o
** .PHONY是爲了不一種情形,當前目錄下已存在名爲clean的文件,在執行clean這個目標的時候,發現已存在clean文件,並clean什麼也沒有,make工具會認爲此目標所依賴的目標沒有發生更新,就不會從新編譯這個目標,也就不會執行下面的rm命令。
5.makefile變量
makefile中的變量沒有類型。一般用來定義一個目錄或一些目標。
b = main.o head.o
a = $(b)
$(a)是對變量a的調用。
a := $(b)
:=是另外一種用法,區別是:=後面只能調用前面已經定義過的變量。避免產生循環調用。
6.makefile控制語句
if .../ifeq...
...
else
...
endif
foreach
...
7.makefile文件引用
#文件引用前面沒有"#"
include "build.mk"
8.makefile函數
咱們可使用使用make提供的函數,也能夠本身定義函數,也能夠叫命令包。
define fun
command
endef
調用函數:$(fun ...)
9.makefile註釋,換行,-f
#此處註釋,同shell註釋#開頭
/ 此處換行,也能夠做爲多行註釋,因此此處也是註釋,哈哈哈~
make命令執行默認會去執行當前目錄下的makefile或者Makefile文件,或者能夠用 -f、 --file 指定執行的makefile文件。make命令後面能夠跟想要執行的目標,否則默認執行makefile開頭的第一個目標。
make -f build.mk
10.makefile動手實踐
說的再多不如動手實踐,能力的得到%70來自實踐。
趕忙動手寫起來吧!
最後,makefile後面進階,則須要多寫makefile,想寫出簡潔可維護的makefile,仍是挺難的,也能夠深刻了解下make工具的執行原理,以及gcc/g++的編譯原理。推薦學習下大神陳皓的《跟我一塊兒寫 Makefile》。