Build 使用我的重定义隐式规则使其不起作用

Build 使用我的重定义隐式规则使其不起作用,build,makefile,Build,Makefile,我想将源代码和目标代码分离到不同的目录 以下是我的目录树: 我想在根目录(TOP)上创建一个“obj”子目录。将所有obj文件放入其中 例如: 然后,这是我的实现: %.o: %.c $(CC) $(CFLAGS) -c -o $(OBJDIR)/$@ $< %.o: %.s $(AS) $(ASFLAGS) -o $(OBJDIR)/$@ $< %.o:%.c $(CC)$(CFLAGS)-c-o$(OBJDIR)/$@$< %.o:%.s $(AS)

我想将源代码和目标代码分离到不同的目录

以下是我的目录树:

我想在根目录(TOP)上创建一个“obj”子目录。将所有obj文件放入其中

例如:

然后,这是我的实现:

%.o: %.c
    $(CC) $(CFLAGS) -c -o $(OBJDIR)/$@ $<

%.o: %.s
    $(AS) $(ASFLAGS) -o $(OBJDIR)/$@ $<
%.o:%.c
$(CC)$(CFLAGS)-c-o$(OBJDIR)/$@$<
%.o:%.s
$(AS)$(ASFLAGS)-o$(OBJDIR)/$@$<
但是我不喜欢这个实现

我想这样写:

    $(OBJDIR)/%.o: %.c
        $(CC) $(CFLAGS) -c -o $@ $<


    $(OBJDIR)/%.o: %.s
        $(AS) $(ASFLAGS) -o $@ $<
$(OBJDIR)/%.o:%.c
$(CC)$(CFLAGS)-c-o$@$<
$(OBJDIR)/%.o:%.s
$(AS)$(ASFLAGS)-o$@$<
如果我这样做,Make就不会遵循这些规则,而是使用隐式规则

谢谢你的帮助


欢迎任何困惑。

如果使用
VPATH

VPATH = bsp hypervisor lib

$(OBJDIR)/%.o: %.c
    $(CC) $(CFLAGS) -c -o $@ $<
指定包含两个目录src和../headers的路径,这两个目录按该顺序进行搜索

使用此VPATH值,将执行以下规则

就好像是这样写的:


当您将所有这些对象文件链接到一个可执行或共享库中时,最终规则的make依赖项是什么?它们是引用$(OBJDIR)/*.o文件,还是仅引用*.o文件?如果是后者,make将据此决定它需要构建名为begin.o的文件,而不是TOP/obj/begin.o,请查找构建此类文件的规则,而不是查找规则。目标
是否全部
,或者您尝试调用的目标是否以某种方式依赖于
$(OBJDIR)/%.o
?向我们展示一个简化版本的工作(你看到的错误)Makefile,我们可以试试吗?我知道了。因为我不会编写诸如$(OBJDIR)/%.o.OBJDIR:=OBJDIR OBJS:=$(addprefix$(OBJDIR)/,foo.o bar.o baz.o)$(OBJDIR)/%.o:%.c$(COMPILE.c)$(OUTPUT\u选项)$ $(OBJDIR)/%.o: %.c $(CC) $(CFLAGS) -c -o $@ $< $(OBJDIR)/%.o: %.s $(AS) $(ASFLAGS) -o $@ $<
VPATH = bsp hypervisor lib

$(OBJDIR)/%.o: %.c
    $(CC) $(CFLAGS) -c -o $@ $<
 VPATH = src:../headers
foo.o : foo.c
foo.o : src/foo.c