1、wildcard :
扩展通配符
2、notdir : 去除路径
3、patsubst :替换通配符
建立一个简单的Makefile
src=$(wildcard *.c./sub/*.c)
dir=$(notdir $(src))
obj=$(patsubst%.c,%.o,$(dir) )
wildcard把 指定目录 ./ 和 ./sub/ 下的所有后缀是c的文件全部展开。
notdir把展开的文件去除掉路径信息
$(patsubst %.c,%.o,$(dir) )中,patsubst把$(dir)中的变量符合后缀是.c的全部替换成.o
$^所有的依赖目标的集合,代表$(OBJS)。
$@表示规则中的目标文件集。
$< 依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的。
$? 所有比目标新的依赖目标的集合。以空格分隔。
例子:
SRCS=$(wildcard*.cpp)#当前目录下所有以.cpp结尾的源文件
OBJS:= $(patsubst%.cpp,%.o,$(SRCS))
CC=g++
INCLUDES=-I/usr/include
LIBS=-L /usr/lib-L /usr/lib64
JCDD=-lpthread
CCFLAGS=-g -Wall-O3#这里指定除了编译器默认的头文件和库文件的路径之外需要额外引##用的头文件路径以及库的路径
TARGET=app
$(TARGET) :$(OBJS)
$(CC) $^ -o $@ $(INCLUDES) $(LIBS) $(JCDD)
%.o : %.c
$(CC) -c $< $(CCFLAGS) $(INCLUDES)$(LIBS) $(JCDD)
.PHONY : clear
clear:
rm -f $(OBJS)
rm -f $(TARGET)