先給大家看段Makefile的代碼吧:
INCLUDE_DIR=usr/java/jdk1.8.0_25/include \ usr/java/jdk1.8.0_25/include/linux INCLUDE_FLAG=$(addprefix -I,${INCLUDE_DIR}) all: ls ${INCLUDE_FLAG}
假如我們在命令行執行下面的命令: make
此時,我們將會看到這樣的輸出:
看到了嗎?命令ls后面兩個的路徑的前面都被添加了-I,和你想像的一樣,該addprefix就是用於添加前綴的,格為:
$(addprefix fixstring,string1 string2 ...)
其中,fixstring表示任意要添加的固定前綴,在逗號的后面可以是一個或多個要添加前綴的子字符串,多個子字符串之間用空格隔開,當然,你也可以像前面的例子一樣用變量。
再舉個例子:
INC = -I../include LIB = -L../lib -lsqlite3 CFLAGS = -lgcc -pthread -ldl DIR_OBJS = ../obj DIR_BIN = ../bin dirs := $(DIR_OBJS) $(DIR_BIN) bin = server src = $(wildcard *.c) obj = $(patsubst %.c,%.o,$(src)) #patsubst模式字符替換函數 #obj = $(src:.c=.o) obj := $(addprefix $(DIR_OBJS)/,$(obj)) bin := $(addprefix $(DIR_BIN)/,$(bin)) #$@ 目標(自動變量) #$^ 依賴 all: $(dirs) $(bin) $(dirs): mkdir $@ $(bin):$(obj) gcc $^ -o $@ $(CFLAGS) $(INC) $(LIB) $(DIR_OBJS)/%.o:%.c gcc $^ -o $@ -c $(CFLAGS) $(INC) $(LIB) clean: rm -rf $(dirs) $(bin) .PHONY:all clean