最近遇到一个需求,目录下有多个c文件和S文件(汇编代码),需要把他们都自动编译成.o文件.经过摸索,最终解决方案如下:
SRCS1 := $(wildcard *.c)
SRCS2 := $(wildcard *.S)
OBJS1 := $(patsubst %.c,%.o,$(SRCS1))
OBJS2 := $(patsubst %.S,%.o,$(SRCS2))
.PHONY : all
all : $(OBJS1) $(OBJS2)
$(OBJS1) : %.o : %.c
$(GCC) -c $< $(CFLAG)
$(OBJS2) : %.o : %.S
$(GCC) -c $< $(CFLAG)
.PHONY : clean
clean :
-rm *.o
核心思路就是
1.利用Makefile的分级目标机制,把汇编文件和c文件分别放到两个不同的子目标中.
比如 $(OBJS1) : %.o : %.c 的意思就是告诉编译器对$(OBJS1)这个列表中的所有.o文件,都有同名的.c文件产生.
类似的$(OBJS2) : %.o : %.S
的意思就是告诉编译器对$(OBJS2)这个列表中的所有.o文件,都有同名的.S文件产生.
这样就解决了.c和.S都产生.o文件的矛盾
2在all目标中依次调用这两个子目标即可.