Makefile例子,能够引用子目录下的源文件,并将二进制文件存放到相应目录
工程目录结构,
fun目录下有fun.c
src目录下有a.c
父目录下有main.c
OBJPATH目录用来存放用来 *.o 文件
MakeFile文件
TARGET=Test
DIR=./fun ./src .
OBJPATH=./OBJPATH
FILES=$(foreach dir,$(DIR),$(wildcard $(dir)/*.c))
OBJS=$(patsubst %.c,%.o,$(FILES))
all:$(OBJS) $(TARGET)
$(OBJS):%.o:%.c
@echo DIR $(DIR)
@echo FILES $(FILES)
$(CC) -c -o $(OBJPATH)/$(notdir $@) $<
$(TARGET):$(OBJPATH)
$(CC) -o $@ $(OBJPATH)/*.o
$(OBJPATH):
mkdir -p $(OBJPATH)
clean:
-rm $(OBJPATH)/*.o
-rm $(TARGET)
解释
#目标文件
TARGET=Test
#所有的目录
DIR=./fun ./src .
#存放obj文件的目录
OBJPATH=./OBJPATH
#一次获取目录下所有.c文件
FILES=$(foreach dir,$(DIR),$(wildcard $(dir)/*.c))
#将.c文件替换为.o2文件
OBJS=$(patsubst %.c,%.o,$(FILES))
#目标文件声明
all:$(OBJS) $(TARGET)
#根据类型生成依赖进而编译生成.o文件,并且存放到OBJPATH目录下
$(OBJS):%.o:%.c
@echo DIR $(DIR)
@echo FILES $(FILES)
$(CC) -c -o $(OBJPATH)/$(notdir $@) $<
#连接所有的二进制文件生成程序
$(TARGET):$(OBJPATH)
$(CC) -o $@ $(OBJPATH)/*.o
#如果存放二进制文件的目录不存在,则创建
$(OBJPATH):
mkdir -p $(OBJPATH)
#清除
clean:
-rm $(OBJPATH)/*.o
-rm $(TARGET)
执行make命令
工程再添加子目录直接MakeFile中的DIR项就行了,
新添加文件或者修改文件名称,则不需要修改Makefile文件。