这是我的整个Makefile:
TGT = call
OBJS = main.o
.PHONY : clean
$(TGT) : $(OBJS)
$(CC) -o $@ $^
%.o : %.s
$(AS) -o $@ $<
%.s : %.c
$(CC) -S -o $@ $<
clean :
$(RM) $(TGT) *.o *.s
当我跑步时,我在期待:
相反,正在做的是:
$ make
cc -c -o main.o main.c
cc -o call main.o
为什么它使用* .o文件的隐式规则而不是我指定的显式规则?请注意,如果我首先手动创建* .s文件,它将使用我的显式规则:
$ make main.s
cc -S -o main.s main.c
$ make
as -o main.o main.s
cc -o call main.o
我是否只是从根本上误解了Make的某些内容?难道它不应该认识到main.s是main.o的先决条件,并使用我指定的规则构建main.s?
答案 0 :(得分:0)
您可以通过为后缀目标设置空值来禁用所有内置后缀规则:
.SUFFIXES:
然后设置自己的后缀:
.SUFFIXES: .o .s
使用标志 -r 或 - no-builtin-rules 运行make也应该这样做。见here。