Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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
Makefile GNU Make:如何使用后缀更改替换执行第二次扩展 我的目标(失败之处)_Makefile_Substitution_Variable Expansion - Fatal编程技术网

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 $<