工程管理器(make):實際上是借助了makefile文件來進行執行。
Make的作用:(實現了批處理)
為什麼我們要使用該工具?
(1):使用方便:即每次編譯時不用在頻繁的輸入gcc命令,直接根據makefile編譯規則
來命令自動對源文件編譯和鏈接。
(2):調試效率高:在時間戳內修改了一個源文件,只編譯被修改的文件,而不用從頭
始編譯,避免了多余的編譯工作量。
Makefile:(屬於腳本文件------腳本語言)
由三項基本內容組成:
(1):需要生成的目標文件。
(2):生成目標文件所需要的依賴文件。
(3):生成目標文件的編譯規則命令行
*Makefile規定在書寫命令行前必須加一個<Tab>鍵:(系統默認是縮進8格)
如://Makefile:
test : a.o b.o
gcc -o test a,o b.o
a.o : a.c b.h
gcc -c a.c
b.o : b.c
gcc -c b.c
<makefile :為什麼.c文件要先生成.o文件,在生成可執行文件?>
因為,在一個工程中,有許多的.c源文件,而先編譯成.o文件是當你要改其中的一個源文件時,只需要編譯相應的,o文件,而其他文件沒有改變,所以相應的.o文件也不變,只需要編譯改變的源文件。提高了代碼的編譯速度(企業最關心的)
Makefile特性:
* $(變量名):變量的命名可以是字符、數字、下劃線。
* “=”:遞歸賦值:如果右側包含的其他變量的值發生變化時,被賦值變量的值也隨
之變化。
* “:=”直接賦值:
* “+=”追加賦值:
* “?=”條件賦值: 如果變量原來無值則賦值,否則保持原來的值。
偽目標:偽目標不是真正的目標文件,只是一個符號,使用“.PHONY”對它進行標識。
一些常用的基本函數:
*subst: 格式:$(subset參數1,參數2,參數3)
功能:把參數3中的參數1替換成參數2,。返回值:被替換後的參數3.
如:result := $(subst china, the world, I love China)
Result的值為“I love the world”
*patsubst: 格式:$(patsubst模式參數,參數1,參數2)
功能:把參數2中符合模式參數的單詞替換成參數1.返回值:被替換後的參數2.
如:result := $(patsubst %.c,%.o,x.c
y.c)
Result的值為“x.o y.o”
*wildcard: 格式:$(wildcard模式參數)
功能:列出當前目錄下所有符合模式參數的文件名。返回值:當前目錄下所有符合模式
參數的文件名。
如:result := $(wildcard *.c)
Result的值為當前目錄下的所有c文件名。
*findstring 格式:$(findstring參數1,參數2)
功能:在參數2中查找參數1,。返回值:如果找到返回參數1,沒找到返回空。
如:result := $(findstring me, you and me )-----result的值為“me”.
Result :=$(fingstring she, you and me)----result的值為“”。
*filter 格式:$(filter模式參數, 參數1)
功能:從參數1中篩選符合模式參數的字符串。返回值:符合參數模式的字符串。
如:a := x.c y.c z.h
Result := $(filter %.c, $(a))
Result的值是“x.c y.c”
*addsuffix 格式:$(addsuffix參數1,參數2)
功能:在參數2中的每個單詞加上後綴參數1.返回值:加上後綴的所有單詞。
如:result := $(addsuffix .c, x y)
Result:的值為“x.c y.c”
*addprefix 格式:$(addprefix 參數1, 參數2)
功能:在參數2中的每個單詞加上前綴參數1。返回值:加上前綴的所有單詞。
如:resut := $(addprefix src/ , x.c y.c)
Result 的值為“src/x.c src/y.c”
*foreach 格式:
$(foreach變量參數,參數1,表達式)
功能:循環取出參數1中的單詞賦給變量參數,然後運行表達式。返回值:表達式的結果
如: a := x y z
Result := $(foreach b, $(a), $(b).c)
Result的值為“x.c y.c z.c”
*call 格式:$(call變量參數,參數.....)
功能:循環把參數依次賦給變量參數中的$(1)、$(2)...,。返回值:賦值後的變量值。
如: a := $(2) $(1)
Result := $(call $(a), x y)
Result的值為“yx”
*if 1格式:$(if條件參數, 執行參數)
功能:如果條件參數非空,運行執行參數部分。返回值:條件參數非空,返回執行參數
如: result := $(if China, world)
Result的值為“world”
2格式:$(if條件參數,執行參數1,執行參數2)
功能:如果條件參數非空,運行執行參數1;反之運行執行參數2.
返回值:條件參數非空,返回執行參數1;反之返回執行參數2.
如:a :=
Result := $(if $(a), china, world)
Result的值為“world”
*dir 格式:$(dir參數)
功能:從參數中取出目錄部分。返回值:目錄部分。
如: result := $(dir /home/test/a.c)
Result的值為“/home/test”
*error 格式:$(error參數)
功能:停止“make”運行名顯示參數。返回值:參數。
如:result := $(error error occure!)
Result的值為“error occure!”
*warning 格式:$(warning參數)
功能:“make”運行時顯示參數。返回值:參數。
如:result := $( warning warning occure!)
Result的值為“warning occure!”
對於一個工程文件來說,它包含了許多源文件,而這些源代碼按照功能不同都放在各自功能的目錄下。因此,查看一個工程文件,應查看它每個目錄下的Makefile,大致個分為這三類:scripts目錄下的Makefile、總控Makefile、功能子目錄下的Makefile。
首先查看的是:scripts目錄下的Makefile:裡面定義了許多變量,相當於c語言中的頭文件。
其次查看的是:總控Makefile:作用是進入各個功能子目錄下去執行make命令。
最後查看的是:功能在目錄下的Makefile:將src目錄下的 .c文件編譯成 .o文件。