舉例:linux
objects := $(wildcard *.o)
objects = *.o
$(patsubst %.c,%.o,$(wildcard *.c))
VPATH = src:../headers
* 上面例子中就是 **VPATH** 的格式,用 **:** 隔開多個路徑。
vpath %.h include //指定.h類型文件的搜索路徑是include
在 Makefile 中,咱們的依賴關係可能會須要包含一系列的頭文件,好比,若是咱們的 main.c 中有一 句 #include "defs.h" ,那麼咱們的依賴關係應該是:函數
main.o : main.c defs.h
大多數的 C/C++ 編譯器都支持一個「-M」的 選項,即自動找尋源文件中包含的頭文件,並生成一個依賴關係。例如,若是咱們執行下面的命令:.net
cc -M main.c
其輸出是:命令行
main.o : main.c defs.h
** 注:若是使用 GNU 的 C/C++ 編譯器,得用 -MM 參數,否則,-M 參數會把一些標準庫的頭文件也包含進來。 **
如:
gcc -M main.c 的輸出是:code
main.o: main.c defs.h /usr/include/stdio.h /usr/include/features.h \ /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \ /usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stddef.h \ /usr/include/bits/types.h /usr/include/bits/pthreadtypes.h \ /usr/include/bits/sched.h /usr/include/libio.h \ /usr/include/_G_config.h /usr/include/wchar.h \ /usr/include/bits/wchar.h /usr/include/gconv.h \ /usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stdarg.h \ /usr/include/bits/stdio_lim.h
gcc -MM main.c 的輸出則是:blog
main.o : main.c defs.h
若是想使用 隱晦規則 + 依賴自動包含頭文件,能夠往下看。get
基於上面這個原理,咱們能夠把 main.c 包含的頭文件 信息 自動識別出來並保存到 main.d 文件中。
這時候,.d 文件就出來了。編譯器
%.d : %.c @set -e;rm -f $@; \ $(CC) -MM $(CPPFLAGS) $< > $@.; \ sed 's,$∗\.o[ :]*,\1.o $@ : ,g' < $@. > $@; \ rm -f $@.
參考同步
main.o: main.c defs.h
* **sed 's,$∗\.o[ :]*,\1.o $@ : ,g' < $@. > $@;** * 表示執行linux 命令 sed * **< $@.** * 該文件內容交給前面,讓 sed 語句處理 * **$∗\.o[ :]\*** * 爲匹配字段 * 表示 main 後面 .o 接着的字串段 * **$∗\.o[ :]\*** * 爲替換字段 * **$@. > $@** * 輸入給 .d 文件,便是 main.d,內容以下:
main.o main.d : main.c defs.h
* **rm -f $@.** * 刪除 main.d.xxxx 的隨機文件。
sed‘s:/usr/local:/usr:g’
sed‘s;/usr/local;/usr;g’