Makefile GNU make不匹配%以从一个规则生成多个目标

Makefile GNU make不匹配%以从一个规则生成多个目标,makefile,Makefile,我很难理解什么是基本的make行为,因为有多个先决条件和一些常见的词干,但它们必须由一条规则匹配 我试着读了这本书,似乎误解了一些基本原理 all: prefix-variant1.so prefix-variant2.so prefix-%.so : %.o @echo "variant with prerequisite succeeded" 当我运行make时,出现以下错误: make: *** No rule to make target 'prefix-variant1.

我很难理解什么是基本的
make
行为,因为有多个先决条件和一些常见的词干,但它们必须由一条规则匹配

我试着读了这本书,似乎误解了一些基本原理

all: prefix-variant1.so prefix-variant2.so

prefix-%.so : %.o
    @echo "variant with prerequisite succeeded"

当我运行
make
时,出现以下错误:

make: *** No rule to make target 'prefix-variant1.so', needed by 'all'.  Stop.
我做错了什么

我做错了什么

请记住,make允许有许多并发模式/后缀规则。例如,一个对象文件<代码> %.o/COD>可以由C编译器从%.C.<代码>或由C++编译器从%.CPP,或者甚至由FORTRAN从>%.F等等中创建。
因此,只有在存在相应的先决条件文件(或可以构建,请参阅)时,才会考虑模式规则。在您的情况下,它是
variant1.o
。如果在当前目录中不存在这样的文件,并且没有其他规则适用于从源建立它,则忽略该规则,并称“没有规则使其成为目标”。

如果没有模式先决条件存在,并且没有已知的规则来生成任何模式规则的先决条件,那么就不必考虑它。因此,如果您有一个模式规则
%.o:%.c$(CC).
,您有一个
variant1.c
文件,然后make将足够智能地连接点,构建
varaint1.o
,然后
prefix-variant1.so
。但是因为
variant1.o
不存在,并且make不知道如何构建它,所以您得到了错误。@HardcoreHenry您是对的,谢谢。我有点粗心。在makein99%的情况下,说“存在”必须扩展为“存在或可以构建”,所以有时候你会忘记它。