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...