为什么 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.o
和 print.o
。因此,它确实构建了这两个文件。您定义了构建 $(ODIR)/%.o
的规则,但 test.o
与模式 $(ODIR)/%.o
不匹配,因此不使用该规则。
相反,make 使用它自己的默认内置规则,这些规则知道如何创建 %.o
;该模式 确实 匹配您的目标 test.o
.
如果你想让 make 在另一个目录中构建对象,你必须在编写规则时将它们列出:
$(BDIR)/test: $(ODIR)/test.o $(ODIR)/print.o
现在,make 知道您想在 $(ODIR)
目录中构建目标,因此它会使用可以这样做的规则。
我在玩 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.o
和 print.o
。因此,它确实构建了这两个文件。您定义了构建 $(ODIR)/%.o
的规则,但 test.o
与模式 $(ODIR)/%.o
不匹配,因此不使用该规则。
相反,make 使用它自己的默认内置规则,这些规则知道如何创建 %.o
;该模式 确实 匹配您的目标 test.o
.
如果你想让 make 在另一个目录中构建对象,你必须在编写规则时将它们列出:
$(BDIR)/test: $(ODIR)/test.o $(ODIR)/print.o
现在,make 知道您想在 $(ODIR)
目录中构建目标,因此它会使用可以这样做的规则。