使用隐式规则而不是显式规则?

Make using implicit rule instead of explicit?

这是我的整个 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 正在做的是:

$ 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 吗?

您只需为后缀目标设置空值即可禁用所有内置后缀规则:

.SUFFIXES:

然后设置自己的后缀:

.SUFFIXES: .o .s

运行 make with flags -r or --no-builtin-rules 应该做同样的事情。参见 here