Makefile例子,能够引用子目录下的源文件,并将二进制文件存放到相应目录

时间:2022-12-06 12:48:48

Makefile例子,能够引用子目录下的源文件,并将二进制文件存放到相应目录

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例子,能够引用子目录下的源文件,并将二进制文件存放到相应目录


工程再添加子目录直接MakeFile中的DIR项就行了,

新添加文件或者修改文件名称,则不需要修改Makefile文件。