Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.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_Pattern Matching_Gnu Make - Fatal编程技术网

Makefile GNU Make——模式匹配依赖项

Makefile GNU Make——模式匹配依赖项,makefile,pattern-matching,gnu-make,Makefile,Pattern Matching,Gnu Make,让文件“prefix hi.c”出现在当前目录中(“>touch prefix hi.c”)。然后,创建以下生成文件: prefix-%.o: prefix-%.c prefix-%-generated.c @echo Specific Rule %.o: %.c @echo General Rule prefix-%-generated.c: touch prefix-$*-generated.c 分两步制作给出了顺序 > make prefix-hi-g

让文件“prefix hi.c”出现在当前目录中(“>touch prefix hi.c”)。然后,创建以下生成文件:

prefix-%.o: prefix-%.c prefix-%-generated.c
    @echo Specific Rule 

%.o: %.c
    @echo General Rule

prefix-%-generated.c:
    touch prefix-$*-generated.c
分两步制作给出了顺序

> make prefix-hi-generated.c
touch prefix-hi-generated.c
> make prefix-hi.o
Specific Rule
删除生成的文件并尝试一步生成会导致

> rm -f prefix-hi-generated.c
> make prefix-hi.o
General Rule
> rm -f prefix-hi-generated.c
> make prefix-hi.o
touch prefix-hi-generated.c
Specific Rule
也就是说,GNU Make没有识别到根据上一条规则构建“prefix hi generated.c”的机会。添加显式规则

prefix-hi-generated.c:
    touch prefix-hi-generated.c
改变一切。现在,一步序列的结果是

> rm -f prefix-hi-generated.c
> make prefix-hi.o
General Rule
> rm -f prefix-hi-generated.c
> make prefix-hi.o
touch prefix-hi-generated.c
Specific Rule
从我的角度来看,这种行为似乎很古怪

  • 对事物的现状有一个合理的解释吗
  • 如果不使用显式规则,如何强制GNU对以“prefix-”开头的文件应用“特定规则”
      这一点在

      具体而言:

      但是请注意,前提条件实际存在或被提及的规则始终优先于具有前提条件的规则,前提条件必须通过链接其他隐式规则来实现


      这是一般规则的一个明显例外,即最窄匹配(最短词干)规则将始终导致匹配。上一个示例按您喜欢的方式工作的原因是,它根本不是基于模式匹配的规则,因此在解决模式匹配之前会进行检查

      这就是导致混乱的规则。这恰恰与直觉的优先顺序相反。这些优先规则需要更高层次的抽象思维,并考虑分散在某些不特定位置的碎片。这在更大的构建系统中是很难管理的。@Frank ReneSchäfer事实上,这是相当违反直觉的。我个人建议您彻底阅读gnu make手册,或者更好,如果您的项目是大型的,使用更强大的make系统,如cmake或qmake,或者任何您与best合作的系统。