【问题标题】:Make using implicit rule instead of explicit?使用隐式规则而不是显式规则?
【发布时间】:2015-05-09 07:09:27
【问题描述】:

这是我的整个 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 时,我期待:

  • 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?

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    您可以通过为后缀目标设置空值来禁用所有内置后缀规则:

    .SUFFIXES:
    

    然后设置自己的后缀:

    .SUFFIXES: .o .s
    

    使用标志 -r--no-builtin-rules 运行 make 应该做同样的事情。见here

    【讨论】:

    • 谢谢。我发现的另一个选项是 cancel built-in rules 使用具有相同模式但没有配方的空规则。
    • @xchrishawk 是的,这也是一个选项
    猜你喜欢
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多