在makefile規則中,萬用字元會被自動展開。但在變數的定義和函式引用時,萬用字元將失效。這種情況下如果需要萬用字元有效,就需要使用函式「wildcard」,它的用法是:$(wildcard pattern...)。在makefile中,它被展開為已經存在的、使用空格分開的、匹配此模式的所有檔案列表。如果不存在任何符合此模式的檔案,函式會忽略模式字元並返回空。需要注意的是:這種情況下規則中萬用字元的展開和上一小節匹配萬用字元的區別。
一般我們可以使用「$(wildcard *.c)」來獲取工作目錄下的所有的.c檔案列表。複雜一些用法;可以使用「$(patsubst %.c,%.o,$(wildcard *.c))」,首先使用「wildcard」函式獲取工作目錄下的.c檔案列表;之後將列表中所有檔名的字尾.c替換為.o。這樣我們就可以得到在當前目錄可生成的.o檔案列表。因此在乙個目錄下可以使用如下內容的makefile來將工作目錄下的所有的.c檔案進行編譯並最後連線成為乙個可執行檔案:
#sample makefile
objects := $(patsubst %.c,%.o,$(wildcard *.c))
foo : $(objects)
cc -o foo $(objects)
這裡我們使用了make的隱含規則來編譯.c的原始檔。對變數的賦值也用到了乙個特殊的符號(:=)。
1、wildcard : 擴充套件萬用字元
2、notdir : 去除路徑
3、patsubst :替換萬用字元
例子:建立乙個測試目錄,在測試目錄下建立乙個名為sub的子目錄
$ mkdir test
$ cd test
$ mkdir sub
在test下,建立a.c和b.c2個檔案,在sub目錄下,建立sa.c和sb.c2 個檔案
建立乙個簡單的makefile
src=$(wildcard *.c ./sub/*.c)
dir=$(notdir $(src))
obj=$(patsubst %.c,%.o,$(dir) )
all:
@echo $(src)
@echo $(dir)
@echo $(obj)
@echo "end"
執行結果分析:
第一行輸出:a.c b.c ./sub/sa.c ./sub/sb.c
wildcard把 指定目錄 ./ 和 ./sub/ 下的所有字尾是c的檔案全部展開。
第二行輸出:a.c b.c sa.c sb.c
notdir把展開的檔案去除掉路徑資訊
第三行輸出:a.o b.o sa.o sb.o
在$(patsubst %.c,%.o,$(dir) )中,patsubst把$(dir)中的變數符合字尾是.c的全部替換成.o,任何輸出。
或者可以使用
obj=$(dir:%.c=%.o) 效果也是一樣的。
這裡用到makefile裡的替換引用規則,即用您指定的變數替換另乙個變數。它的標準格式是
$(var:a=b) 或 $ 它的含義是把變數var中的每乙個值結尾用b替換掉a
第十二講 多目錄下makefile的通用寫法zz
發信人 gdtyy gdtyy 信區 embedded 標 題 第十二講 多目錄下makefile的通用寫法 發信站 水木社群 mon jun 25 23 36 58 2007 站內 第十二講 多目錄下makefile的通用寫法 2007 03 14 asdjf 163.com www.armeco...
makefile學習筆記 makefile概述
20180411 makefile學習筆記 makefile概述 makefile主要是在unix下軟體編譯時寫的,window下一般不用 unix裡makefile做的事 相當於window裡ide所做的事 會不會寫makefile,從乙個側面說明了乙個人是否具備完成大型工程的能力。makefil...
Makefile介紹及Makefile是如何工作的
make命令執行時,需要乙個 makefile 檔案,以告訴make命令如何去編譯和鏈結程式。首先,我們用乙個示例來說明makefile的書寫規則。以便給大家乙個感性認識。這個示例 於gnu的make使用手冊,在這個示例中,我們的工程有8個c檔案,和3個頭檔案,我們要寫乙個makefile來告訴ma...