1、今天在看Makefile文件的時候看到了一個BUILD_SO = $(LSRCS:%.c=$(BUILD_DIR)/%.o) ,不太明白這個具體是什麼含義。在網上找了一下根據前人的分享,自己也記錄一下:
BUILD_SO = $(LSRCS:%.c=$(BUILD_DIR)/%.o) ,這句代碼的意思將變量LSRCS中所有的以.c結尾的文件都用目錄BUILD_DIR下的.o替換。
另外:wildcard可以後面跟多個路徑,使用方法如下:
假如我在當前目錄下創建一個test目錄,在test 目錄下創建兩個文件1.c和2.c;再test目錄再新建一個子目錄sub,在子目錄sub下新建sub1.c和sub2.c。我們在test目錄下使用Makefile可以這樣寫:
src=$(wildcard *.c ./sub/*.c)
all:
@echo $(src)
這樣就會輸出
1.c 2.c ./sub/sub1.c ./sub/sub2.c
使用@echo 這樣終端輸出的信息就是命令之後的結果,而不會在終端上把命令也打印出來。即如果去掉@ 終端打印的信息就是:
echo a.c b.c ./sub/sub1.c ./sub/sub2.c
1.c 2.c ./sub/sub1.c ./sub/sub2.c
這樣一個結果。
如果在輸出的結果中不想帶./sub/這個路徑的話,可以使用notdir,使用方法:
dir=$(notdir $(src))
這樣輸出出來就是:1.c 2.c sub1.c sub2.c了。
obj=$(patsubst %.c,%.o,$(dir)),把上面$(dir)變量裏面以.c結尾的文件全部替換爲.o結尾。
跟這個等效的一句程序是上面那句: BUILD_SO = $(LSRCS:%.c=$(BUILD_DIR)/%.o) 類似,
obj=$(dir:%.c=%.o);
他的標準格式應該是:
$(var:a=b) 或 ${var:a=b}
它的含義是把變量var中的每一個值結尾用b替換掉a。
--------------------------------------------------------------------------------------------------------------------
補充:
1、Makefiel中foreach的使用:
通用表達式: $(foreach <var>,<list>,<text>)
這個的意思就是:把list中遍歷一遍,取出其中的每一個單詞放到 var中,最後按照執行text的表達式。執行text表達式的時候,每次返回一個字符串,然後以空格隔開,最後text返回的每個字符串組成的整個字符都將是foreach函數的返回值。