使用隐式规则而不是显式规则?
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
当我 运行 制作时,我期待:
- main.s 从 main.c
构建
- main.o 从 main.s
构建
- 调用是从 main.o
构建的
相反,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。
这是我的整个 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
当我 运行 制作时,我期待:
- main.s 从 main.c 构建
- main.o 从 main.s 构建
- 调用是从 main.o 构建的
相反,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。