Makefile中的$(addprefix),添加前缀,指定目标生成目录

先给大家看段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
 
posted @ 2019-12-25 10:48  任仁人  阅读(3398)  评论(0编辑  收藏  举报