make的靜態模式

2021-09-06 10:11:33 字數 2043 閱讀 2180

make的

靜態模式

靜態模式可以更加容易地定義多目標的規則,可以讓我們的規則變得更加的有彈性和靈活。我們還是先來看一下語法:

: :

...targets

定義了一系列的目標檔案,可以有萬用字元。是目標的乙個集合。

target-pattern

是指明了

targets

的模式,也就是的目標集模式。

prereq-patterns

是目標的依賴模式,它對

target-pattern

形成的模式再進行一次依賴目標的定義。

這樣描述這三個東西,可能還是沒有說清楚,還是舉個例子來說明一下吧。如果我們的

定義成「%. o」

,意思是我們的

集合中都是以

「.o」

結尾的,而如果我們的

定義成

「%.c」

,意思是對

所形成的目標集進行二次定義,其計算方法是,取

模式中的

「%」(也就是去掉了

[.o]

這個結尾),並為其加上

[.c]

這個結尾,形成的新集合。

所以,我們的「

目標模式」或是

「依賴模式

」中都應該有

「%」這個字元,如果你的檔名中有

「%」那麼你可以使用反斜槓

「\」進行轉義,來標明真實的

「%」字元。

看乙個例子:

objects = foo.o bar.o

all: $(objects)

$(objects): %.o: %.c

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

上面的例子中,指明了我們的目標從$object

中獲取,

「%.o」

表明要所有以

「.o」

結尾的目標,也就是

「foo.o bar.o」

,也就是變數

$object

集合的模式,而依賴模式

「%.c」

則取模式

「%.o」

的「%」

,也就是

「foo bar」

,並為其加下

「.c」

的字尾,於是,我們的依賴目標就是

「foo.c bar.c」

。而命令中的

「$<」

和「$@」

則是自動化變數,

「$<」

表示所有的依賴目標集(也就是

「foo.c bar.c」

),「$@」

表示目標集(也就是

「foo.o bar.o」

)。於是,上面的規則展開後等價於下面的規則:

foo.o : foo.c

$(cc) -c $(cflags) foo.c -o foo.o

bar.o : bar.c

$(cc) -c $(cflags) bar.c -o bar.o

試想,如果我們的「%.o」

有幾百個,那種我們只要用這種很簡單的

「靜態模式規則

」就可以寫完一堆規則,實在是太有效率了。

「靜態模式規則

」的用法很靈活,如果用得好,那會乙個很強大的功能。再看乙個例子:

files = foo.elc bar.o lose.o

$(filter %.o,$(files)): %.o: %.c

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

$(filter %.elc,$(files)): %.elc: %.el

emacs -f batch-byte-compile $<

$(filter %.o,$(files))

表示呼叫

makefile

的filter

函式,過濾

「$files」

集,只要其中模式為

「%.o」

的內容。其的它內容,我就不用多說了吧。這個例子展示了

makefile

中更大的彈性。

原文

GUN make 9 make的靜態庫檔案

靜態庫檔案也稱為 文件檔案,是由一些 o 檔案的集合。在linux中使用工具 ar 對其進行維護管理。1.庫成員作為目標 庫成員作為目標時,使用如下格式 archive member 表示庫archive的成員member。同時指定庫的多個成員 foolib hack.o dge.o 等價於 foo...

make太慢了,加快編譯速度的方法 make j

make j 既然io不是瓶頸,那cpu就應該是乙個影響編譯速度的重要因素了。用make j帶乙個引數,可以把專案在進行並行編譯,比如在一台雙核的機器上,完全可以用make j4,讓make最多允許4個編譯命令同時執行,這樣可以更有效的利用cpu資源。還是用kernel來測試 用make 40分16...

make太慢了,加快編譯速度的方法 make j

2018 01 18 09 04 05 gonghuihuihui 閱讀數 21957 收藏 更多 分類專欄 linux make j 既然io不是瓶頸,那cpu就應該是乙個影響編譯速度的重要因素了。用make j帶乙個引數,可以把專案在進行並行編譯,比如在一台雙核的機器上,完全可以用make j4...