C++ Makefile-替换为通配符
在我的项目中,所有.cpp文件都存储在C++ Makefile-替换为通配符,c++,makefile,C++,Makefile,在我的项目中,所有.cpp文件都存储在 Classes/ Classes/Something/ Classes/Something/Else ... 我想将所有.cpp文件单独编译到Bin/directory,并用\替换/以便: Classes/First.cpp -> Bin/Classes_First.o Classes/Foo/Bar.cpp -> Bin/Classes_Foo_Bar.o 现在我想创建编译规则: Bin/%.o: $(subst _,/,%.cpp)
Classes/
Classes/Something/
Classes/Something/Else
...
我想将所有.cpp文件单独编译到Bin/directory,并用\替换/以便:
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/Class_Test.o
但编译失败了
所以我创建了调试模式:
%.cpp:
@echo CPP: $@
现在它打印了:
CPP: Classes_Test.cpp
为什么
因此,我将我的模式改为:
Bin/%.o: $(subst _,/,Test1_Test2.cpp)
我看到:
CPP: Test1/Test2.cpp
如果我使用通配符作为源,我有点困惑为什么subst不工作…这是一个计算顺序问题 当make解析makefile时,它计算
$(subst)
调用,但此时$(subst)
的参数是文本字符串%.cpp
,该字符串中没有可替换的内容,因此不做任何操作
在目标评估/执行时,填写目标模式和prereq模式中的%
,但$(subst)
早已消失
为此,您需要手动(以某种方式)将输出文件映射到输入文件。您可以这样做,并保留%.o
模式规则目标以供实际配方运行(因此您只需要生成一组Bin/Test1\u Test2.o:Test1/Test2.cpp
行)
或者,我相信您可以使用:
.SECONDEXPANSION:
Bin/%.o: $$(subst _,/,%.cpp)