Makefile 为什么$*或%在此生成文件中不起作用?
考虑以下简单的makefile:Makefile 为什么$*或%在此生成文件中不起作用?,makefile,gnu-make,Makefile,Gnu Make,考虑以下简单的makefile: define cat_deps $(shell cat $(1).dep) endef TARGET := main.o all:$(TARGET) @echo Done...! %.o:$(call cat_deps,$*) @echo $* 在目标main.o中变量$(1)在cat\u desp中必须是main 但它是空字符串。另外,$(请致电cat_deps,%)不起作用 在这种情况下,变量$(1)变为%。注 该文件main
define cat_deps
$(shell cat $(1).dep)
endef
TARGET := main.o
all:$(TARGET)
@echo Done...!
%.o:$(call cat_deps,$*)
@echo $*
在目标main.o中
变量$(1)
在cat\u desp中
必须是main
但它是空字符串。另外,$(请致电cat_deps,%)
不起作用
在这种情况下,变量$(1)
变为%
。注
该文件main.dep
存在。请帮帮我
在目标main.o
变量$(1)
中的cat_desp
必须是main
,但它是空字符串
如果将main
传递给函数cat\u deps
,则cat\u deps
中的$1
实际上会扩展到main
。但是,您正在传递一个空字符串。按照你的规则:
%.o: $(call cat_deps,$*)
@echo $*
上面的$*
在匹配规则之前展开,在匹配该规则之前,自动变量$*
实际上是空的
在规则匹配后,您需要使用以扩展对
cat_deps
的函数调用和自动变量$*
,即:
.SECONDEXPANSION:
%.o: $$(call cat_deps,$$*)
@echo $*
注意call
和$*
的附加$
请注意,您还需要以下不带配方的规则:
%: %.o
以抑制该隐式规则。否则,上面新的
%.o
规则的先决条件可以匹配(未抑制的)隐式规则,该隐式规则以.o
文件作为先决条件,然后将再次匹配新的%.o
规则 根据经验,您不想被make
解释的每个$
都应该加倍。特别是在Unix shell解释的命令中出现的$
-s。“经验法则”您是对的,但在时间宝贵时,用一个简单的问题代替阅读手册似乎更好。对不起,我有个低级的问题。