Makefile GNU Make:如何使用后缀更改替换执行第二次扩展 我的目标(失败之处)
我有每个文件的依赖项列表:Makefile GNU Make:如何使用后缀更改替换执行第二次扩展 我的目标(失败之处),makefile,substitution,variable-expansion,Makefile,Substitution,Variable Expansion,我有每个文件的依赖项列表: point_deps = bounds_deps = point triangle_deps = point bounds Image_deps = types bounds triangle main_deps = Image triangle bounds point types 我想写一个规则来包含相关的依赖项。以下是我最好的尝试: out/%.o: src/%.cpp src/%.h $$($$*_deps:%=src/%.h) g++ -o $@ -c
point_deps =
bounds_deps = point
triangle_deps = point bounds
Image_deps = types bounds triangle
main_deps = Image triangle bounds point types
我想写一个规则来包含相关的依赖项。以下是我最好的尝试:
out/%.o: src/%.cpp src/%.h $$($$*_deps:%=src/%.h)
g++ -o $@ -c $<
什么在起作用(非最佳)
现在,我必须为每个文件的头依赖项创建一个单独的变量:
point_deps_h = $(point_deps:%=src/%.h)
bounds_deps_h = $(bounds_deps:%=src/%.h)
triangle_deps_h = $(triangle_deps:%=src/%.h)
Image_deps_h = $(Image_deps:%=src/%.h)
main_deps_h = $(main_deps:%=src/%.h)
然后我可以使用包含正确的头文件:
out/%.o: src/%.cpp src/%.h $$($$*_deps_h)
g++ -o $@ -c $<
out/%.o:src/%.cpp src/%.h$$($$*\u deps\u h)
g++-o$@-c$<
是否改用$$(addprefix src/,$$(addsuffix.h,$$*\u deps))
?但是,如果您希望列表中的*\u deps
变量起作用,那么这不会递归地展开。嗨,伊坦,谢谢您的建议。我尝试过各种各样的变化,但运气不好。该选项也不起作用,导致错误:make:**没有规则将目标设置为“out/main.o”,这是“光栅”所需要的。停止。
@EtanReisner:我想你的意思是..$$($$*\u deps))
(我不认为需要递归扩展)。@Beta我相信你是对的。我把它写在评论框里。我所说的“递归”是指,如果你看一下列出的DEP的值,它们会嵌套<代码>点列为边界中的一个条目
,等等。我不确定这些是应该是文件名还是应该是递归嵌套列表,所以我想我应该提到它。短格式模式替换不适用于先决条件,因为:
会混淆,因为它在第一次传递时不在变量内。您使用addprefix
和addsuffix
的解决方案很好,但更直接适用的是patsubst
:$$(patsubst%,src/%.h,$$($$$*\u deps))
。简短形式的模式替换只是patsubst
的语法糖,它们总是可以通过明显的翻译直接互换。干杯
out/%.o: src/%.cpp src/%.h $$($$*_deps_h)
g++ -o $@ -c $<