Makefile构建目录和依赖项列表

时间:2010-03-03 20:53:20

标签: g++ dependencies makefile subdirectory

在makefile中,我在 build 目录中构建了所有.o文件:

program: class1.o class2.o class3.o
    g++ $(BUILDDIR)class1.o $(BUILDDIR)class2.o $(BUILDDIR)class3.o -o $@

从依赖项列表中生成$(BUILDDIR)class1.o $(BUILDDIR)class2.o $(BUILDDIR)class3.o会很酷......

我知道$^会给我所有依赖项的列表,用空格分隔,但我不能处理子目录。

有可能吗?

如果我有program: class1.o class2.o class3.o configure,我可以从列表中排除configure吗?

谢谢:)

编辑:迈克尔的解决方案效果很好,但是这样做,make找不到依赖关系并且每次都必须构建所有内容...制作时没有更简单的方法隐式规则,如program: class1.o class2.o class3.o,告诉它将二进制文件放在 build 目录中?

2 个答案:

答案 0 :(得分:5)

脱离我的头顶

g++ $(addprefix $(BUILDDIR), $^) -o $@

应该这样做。

Make manual在第8.3节中列出了这些功能。

答案 1 :(得分:5)

你已经遇到了两个(或者三个)Make的大缺点。它擅长使用文件那里来制作文件这里,但不是相反,如果规则制作的东西不是确切的目标(并且它是自动的),它就会变得混乱变量应该在先决条件中起作用,但它们不起作用。幸运的是,我们可以解决这些问题。

当您使用Michael Kohne的解决方案时,Make无法找到先决条件,因为它正在寻找class1.o,而不是$(BUILDDIR)class1.o。 (如果您只是简单地告诉它使用VPATH查看$(BUILDDIR),您可能会遇到其他问题。)

最简单,最原始的解决方案(如果你没有太多经验,我建议)是蛮力:

NAMES = class1 class2  
OBJECTS = $(patsubst %,$(BUILDDIR)%.o,$(NAMES))

program: $(OBJECTS) configure
    g++ $(OBJECTS) -o $@

$(OBJECTS):$(BUILDDIR)%.o:%.cc
    g++ -c $^ -o $@

使用更先进的技术有更优雅的解决方案,但现在应该这样做。