Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Makefile-替换为通配符_C++_Makefile - Fatal编程技术网

C++ Makefile-替换为通配符

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)

在我的项目中,所有.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)