3

在 makefile 中,我在构建目录中构建所有 .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告诉它将二进制文件放在构建目录中?

4

2 回答 2

5

在我的头顶

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

应该这样做。

Make 手册在第 8.3 节中列出了这些函数。

于 2010-03-03T21:02:00.373 回答
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 $@

There are more elegant solutions using more advanced techniques, but this should do for now.

于 2010-03-06T04:39:42.527 回答