歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> linux之工程管理器Make

linux之工程管理器Make

日期:2017/3/3 11:30:54   编辑:Linux技術

工程管理器(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文件。

Copyright © Linux教程網 All Rights Reserved