Makefile 基本知識

2021-09-08 10:46:24 字數 4123 閱讀 4601

technorati 標籤:

makefile 基本知識

最常見的書寫方式:

cc =gcc

ld =ld

strip =strip

cflags := -os -static -dez_os_linux

clflags := -os -static

all: main

exec =main

objs =main.o mytool1.o mytool2.o

incs =mytool1.h mytool2.h

all: $(exec)

$(exec): $(objs)

$(cc) $(cflags) -o $@ $(objs)

$(strip) $@

clean:

-rm -f $(exec) *.elf *.gdb *.o

%.o: %.c $(incs)

$(cc) $(cflags) -c $< -o $@

makefile中允許使用簡單的巨集來指代原始檔以及相關編譯選項,引用巨集時,必須在變數名稱前加美元$,同時,使用圓括號括起來(變數名為兩個字母以上時)

下面都是有效的巨集引用:

$(cflags)

$2$z

$(z) 

其中最後兩個引用是完全一致的。

$@      --  目標檔案,  

$^      --  所有的依賴檔案,

$<      --  第乙個依賴檔案。

# 這是簡化後的makefile

main:main.o mytool1.o mytool2.o

gcc -o $@ $^            //$@ 就是main, $^就是main.o mytool1.o mytool2.o

main.o:main.c mytool1.h mytool2.h

gcc -c $<               //$《就是main.c

mytool1.o:mytool1.c mytool1.h

gcc -c $<               //$《就是mytool1.c

mytool2.o:mytool2.c mytool2.h

gcc -c $<               //$《就是mytool2.c

1.$(subst from,to,text)

函式名稱:字串替換函式—subst。

函式功能:把字串「text」中的「from」字元替換為「to」。

返回值:替換後的新字串。

2.$(patsubst pattern,replacement,text)

函式名稱:模式替換函式—patsubst。

函式功能:搜尋「text」中以空格分開的單詞,將否符合模式「tattern」替換為「replacement」。引數「pattern」中可以使用模式萬用字元「%」來代表乙個單詞中的若干字元。

返回值:替換後的新字串。

函式說明:引數「text」單詞之間的多個空格在處理時被合併為乙個空格,但前導和結尾空格忽略。

3.$(strip strint)

函式名稱:去空格函式—strip。

函式功能:去掉字串(若干單詞,使用若干空字元分割)「strint」開頭和結尾的空字元,並將其中多個連續空字元合併為乙個空字元。

返回值:無前導和結尾空字元、使用單一空格分割的多單詞字串。

函式說明:空字元包括空格、[tab]等不可顯示字元。

4.$(sort list)

函式名稱:排序函式—sort。

函式功能:給字串「list」中的單詞以首字母為準進行排序(公升序),並取掉重複的單詞

返回值:空格分割的沒有重複單詞的字串。

函式說明:兩個功能,排序和去字串中的重複單詞。可以單獨使用其中乙個功能。

二、檔名處理函式

1.$(dir names…)

函式名稱:取目錄函式—dir。

函式功能:從檔名序列「names…」中取出各個檔名目錄部分。檔名的目錄部分就是包含在檔名中的最後乙個斜線(「/」)(包括斜線)之前的部分。

返回值:空格分割的檔名序列「names…」中每乙個檔案的目錄部分。

函式說明:如果檔名中沒有斜線,認為此檔案為當前目錄(「./」)下的檔案。

2.$(notdir names…)

函式名稱:取檔名函式——notdir。

函式功能:從檔名序列「names…」中取出非目錄部分。目錄部分是指最後乙個斜線(「/」)(包括斜線)之前的部分。刪除所有檔名中的目錄部分,只保留非目錄部分

返回值:檔名序列「names…」中每乙個檔案的非目錄部分。

3.$(addprefix prefix,names…)

函式名稱:加字首函式—addprefix。

函式功能:為「names…」中的每乙個檔名新增字首「prefix」。引數「names…」是空格分割的檔名序列,將「suffix」新增到此序列的每乙個檔名之前。

返回值:以單空格分割的新增了字首「prefix」的檔名序列。

4.$(wildcard pattern)

函式名稱:獲取匹配模式檔名函式—wildcard

函式功能:列出當前目錄下所有符合模式「pattern」格式的檔名。

返回值:空格分割的、存在當前目錄下的所有符合模式「pattern」的檔名。

函式說明:「pattern」使用shell可識別的萬用字元,包括「?」(單字元)、「*」(多字元)等。

三、其它函式

1.$(foreach var,list,text)

函式功能:函式「foreach」不同於其它函式。它是乙個迴圈函式。類似於linux的shell中的迴圈(for語句)。這個函式的工作過程是這樣的:如果必要(存在變數或者函式的引用),首先展開變數「var」和「list」;而表示式「text」中的變數引用不被展開。執行時把「list」中使用空格分割的單詞依次取出賦值給變數「var」,然後執行「text」表示式。重複直到「list」的最後乙個單詞(為空時結束)。「text」中的變數或者函式引用在執行時才被展開,因此如果在「text」中存在對「var」的引用,那麼「var」的值在每一次展開式將會到的不同的值。

返回值:空格分割的多次表示式「text」的計算的結果。

2.$(if condition,then-part[,else-part])

函式功能:函式「if」提供了乙個在函式上下文中實現條件判斷的功能。就像make所支援的條件語句—ifeq。第乙個引數「condition」,在函式執行時忽略其前導和結尾空字元並展開。「condition」的展開結果非空,則條件為真,就將第二個引數「then_patr」作為函式的計算表示式,函式的返回值就是第二表示式的計算結果;「condition」的展開結果為空,將第三個引數「else-part」作為函式的表示式,返回結果為第三個表示式的計算結果。

返回值:根據條件決定函式的返回值是第乙個或者第二個引數表示式的計算結果。當不存在第三個引數「else-part」,並且「condition」展開為空,函式返回空。

函式說明:函式的條件表示式「condition」決定了,函式的返回值只能是「then-part」或者「else-part」兩個之一的計算結果。

3.$(shell command arguments)

函式功能:函式「shell」所實現的功能和shell中的引用(``)相同。實現了命令的擴充套件。意味著需要乙個shell命令作為它的引數,而返回的結果是此命令在shell中的執行結果。make僅僅對它的回返結果進行處理;make將函式的返回結果中的所有換行符(「\n」)或者一對「\n\r」替換為單空格;並去掉末尾的回車符號(「\n」)或者「\n\r」。函式展開式時,它所呼叫的命令(它的引數)得到執行。除了對它的引用出現在規則的命令列中和遞迴的變數定義引用以外,其它決大多數情況下,make在讀取makefile時函式shell就被擴充套件。

返回值:函式「shell」的引數在shell中的執行結果。

函式說明:函式本身的返回值是其引數的執行結果,沒有進行任何處理。對結果的處理是由make進行的。當對函式的引用出現在規則的命令列中,命令列在執行時函式引用才被展開。展開過程函式引數的執行時在另外乙個shell程序中完成的,因此對於出現在規則命令列的多級「shell」函式引用需要謹慎處理,否則會影響效率(每一級的「shell」函式的引數都會有各自的shell程序)。

Oracle 基本知識

乙個表空間只能屬於乙個資料庫 每個資料庫最少有乙個控制檔案 建議3個,分別放在不同的磁碟上 每個資料庫最少有乙個表空間 system表空間 建立system表空間的目的是盡量將目的相同的表存放在一起,以提高使用效率,只應存放資料字典 每個資料庫最少有兩個聯機日誌組,每組最少乙個聯機日誌檔案 乙個資料...

Oracle 基本知識

乙個表空間只能屬於乙個資料庫 每個資料庫最少有乙個控制檔案 建議3個,分別放在不同的磁碟上 每個資料庫最少有乙個表空間 system表空間 建立system表空間的目的是盡量將目的相同的表存放在一起,以提高使用效率 每個資料庫最少有兩個聯機日誌檔案 乙個資料檔案只能屬於乙個表空間 乙個資料檔案一旦被...

Oracle 基本知識

oracle 文章摘要 oracle 基本知識。正文 oracle 基本知識 乙個表空間只能屬於乙個資料庫 每個資料庫最少有乙個控制檔案 建議3個,分別放在不同的磁碟上 每個資料庫最少有乙個表空間 system表空間 建立system表空間的目的是盡量將目的相同的表存放在一起,以提高使用效率 每個資...