Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.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 为什么$*或%在此生成文件中不起作用?_Makefile_Gnu Make - Fatal编程技术网

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

考虑以下简单的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.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。“经验法则”您是对的,但在时间宝贵时,用一个简单的问题代替阅读手册似乎更好。对不起,我有个低级的问题。