Makefile构建目录和依赖项列表

Kla*_*aus 3 dependencies makefile g++ subdirectory

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

program: class1.o class2.o class3.o
    g++ $(BUILDDIR)class1.o $(BUILDDIR)class2.o $(BUILDDIR)class3.o -o $@
Run Code Online (Sandbox Code Playgroud)

$(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,告诉它把二进制文件在构建目录?

Mic*_*hne 5

在我的头顶

g++ $(addprefix $(BUILDDIR), $^) -o $@
Run Code Online (Sandbox Code Playgroud)

应该这样做.

进行手动具有的这些功能在8.3节的列表.

  • 是的...错过它并不觉得太糟糕.像大多数GNU文档一样,我发现Make手册对于已经了解所有内容的人来说组织得很好,只需要查找确切的拼写或其他内容.如果你不确定所谓的内容是什么,那么在没有阅读整个内容的情况下,实际上不可能在GNU手册中找到它. (2认同)

Bet*_*eta 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 $@

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