在我的项目中,所有.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不起作用...
答案 0 :(得分:0)
这是评估订单问题。
当make解析makefile时,它会评估$(subst)
调用,但此时$(subst)
的参数是文字字符串%.cpp
,它没有任何内容可以替代它,所以不做任何东西。
在目标评估/执行时,目标模式和先决条件模式中的%
被填写,但$(subst)
已经很久了。
要执行此操作,您需要手动(以某种方式)将输出文件映射到输入文件。您可以这样做并保持%.o
模式规则目标,以便运行实际配方(因此您只需要生成一堆Bin/Test1_Test2.o: Test1/Test2.cpp
行。)
或者,我相信您可以使用secondary expansion来执行此操作:
.SECONDEXPANSION:
Bin/%.o: $$(subst _,/,%.cpp)