Makefile - 替换为通配符

时间:2014-10-01 15:43:49

标签: c++ makefile

在我的项目中,所有.cpp文件都存储在

Classes/
Classes/Something/
Classes/Something/Else
...

我想将所有.cpp文件separetly编译到Bin /目录,用/替换/,以便:

Classes/First.cpp -> Bin/Classes_First.o
Classes/Foo/Bar.cpp -> Bin/Classes_Foo_Bar.o

现在我想创建编译规则:

Bin/%.o: $(subst _,/,%.cpp)
    $(COMPILER)g++ $(COMPILE_FLAGS) -c -o $@ $^

我试过了:

制作Bin / Classes_Test.o

但编译失败了。

所以我创建了调试模式:

%.cpp:
    @echo CPP: $@

现在打印出来了:

CPP: Classes_Test.cpp

为什么?!

所以我将模式改为:

Bin/%.o: $(subst _,/,Test1_Test2.cpp)

我看到了:

CPP: Test1/Test2.cpp

我有点困惑,如果我使用通配符作为来源,为什么subst不起作用...

1 个答案:

答案 0 :(得分:0)

这是评估订单问题。

当make解析makefile时,它会评估$(subst)调用,但此时$(subst)的参数是文字字符串%.cpp,它没有任何内容可以替代它,所以不做任何东西。

在目标评估/执行时,目标模式和先决条件模式中的%被填写,但$(subst)已经很久了。

要执行此操作,您需要手动(以某种方式)将输出文件映射到输入文件。您可以这样做并保持%.o模式规则目标,以便运行实际配方(因此您只需要生成一堆Bin/Test1_Test2.o: Test1/Test2.cpp行。)

或者,我相信您可以使用secondary expansion来执行此操作:

.SECONDEXPANSION:
Bin/%.o: $$(subst _,/,%.cpp)