Build 使用我的重定义隐式规则使其不起作用
我想将源代码和目标代码分离到不同的目录 以下是我的目录树: 我想在根目录(TOP)上创建一个“obj”子目录。将所有obj文件放入其中 例如: 然后,这是我的实现: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)
%.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