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
,告诉它把二进制文件在构建目录?
在我的头顶
g++ $(addprefix $(BUILDDIR), $^) -o $@
Run Code Online (Sandbox Code Playgroud)
应该这样做.
将进行手动具有的这些功能在8.3节的列表.
你已经遇到了两个(或者三个)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 $@
使用更先进的技术有更优雅的解决方案,但现在应该这样做.