为什么 makefile 不将输出文件保存到不同的目录?

Why makefile is not saving output files to different directory?

我在玩 makefile 时遇到了这个问题 - 它没有将输出文件保存到不同的目录。

CC = g++
CFLAGS = -c -Wall
ODIR = obj
BDIR = bin

$(BDIR)/test: test.o print.o
    $(CC) test.o print.o -o test

$(ODIR)/%.o: %.cpp %.h
    $(CC) $(CFLAGS) $< -o $@

.PHONY : clean
clean:
    rm -f $(ODIR)/*.o $(BDIR)/test

即使我手动创建这些目录,它也无法按预期工作。 "make" 之后两个目录都是空的,没有任何错误。输出文件总是在主目录中创建。如果您能给我一个建议,将不胜感激。

这条规则:

$(BDIR)/test: test.o print.o

告诉 make 要构建 $(BDIR)/test 它首先需要构建 test.oprint.o。因此,它确实构建了这两个文件。您定义了构建 $(ODIR)/%.o 的规则,但 test.o 与模式 $(ODIR)/%.o 不匹配,因此不使用该规则。

相反,make 使用它自己的默认内置规则,这些规则知道如何创建 %.o;该模式 确实 匹配您的目标 test.o.

如果你想让 make 在另一个目录中构建对象,你必须在编写规则时将它们列出:

$(BDIR)/test: $(ODIR)/test.o $(ODIR)/print.o

现在,make 知道您想在 $(ODIR) 目录中构建目标,因此它会使用可以这样做的规则。