在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 目录中?
答案 0 :(得分:5)
答案 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 $@
使用更先进的技术有更优雅的解决方案,但现在应该这样做。