先给大家看段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