“多个目标模式” Makefile错误


80

我的makefile失败并出现错误:

Makefile:34: *** multiple target patterns.  Stop.

这到底是什么意思,我该如何解决?

(由Obvious上尉编写的GNU make手册无济于事)。


找到了。我有规则的形式:

$(FOO): bar

其中FOO,从壳命令与一个含有结肠错误消息污染其设置。




这些答案只是“您有多个目标模式”的表述。好吧,我想我没有。我该如何检查?什么会触发呢?需要采取哪些预防措施来防止此问题?
Kornel

2
一切都在工作一分钟,然后我的脚本打了一个(半)冒号……呵呵。在找到您和@mcr的答案之前,至少要花3个小时才能发现问题。您刚刚为我省了大汗!
GuruM'1

这个问题的真正根源是GNU Make是应该在几十年前就死掉的可怕的粪便。
antred

Answers:


60

我在Makefile上有它

MAPS+=reverse/db.901:550:2001.ip6.arpa 
lastserial:  ${MAPS}
    ./updateser ${MAPS}

这是因为:文件名中的。我解决了

                      -  -  -  -  注意
                     ///
                    vv
MAPS + =反向/db.901\:550\:2001.ip6.arpa
lastserial:$ {MAPS}
    ./updateser $ {MAPS}

1
我有同样的问题,但我不明白您的回答,请您为我进一步说明一下
Pir Fahim Shah 2013年

4
@PirFahimShah答案表明,文件名(db.901:550:2001.ip6.arpa)中的冒号需要转义。mcr通过在冒号前面加上反斜杠来逃避冒号。这样,make不会将冒号解释为特殊符号。
罗杜威克

谢谢,对我有用。我C:/Qt/5.8/mingw53_32/bin/rcc.exe在Makefile规则之一中有一些带有()冒号的旧Windows路径。如果您在Linux机器上构建,请删除那些自动生成的makefile
Vadim Kotov

21

除了必须像原始答案中那样避免冒号,我发现如果缩进不正确,您可能会遇到同样的问题。在一个makefile中,我必须用制表符替换空格,这使我能够克服错误。


在这种情况下,GNU make也可能会报告“目标无规则”。
davenpcj

4

我只想添加一下,如果由于使用Cygwin make和自动生成的文件而出现此错误,则可以使用以下sed进行修复,

sed -e 's@\\\([^ ]\)@/\1@g' -e 's@[cC]:@/cygdrive/c@' -i filename.d

在第一次替换中,您可能需要向转义列表中添加多个字符,而不仅仅是空格,但是您明白了。这里的概念是/ cygdrive / c是c的别名:cygwin的make可以识别。

并且不妨抛出

-e 's@^ \+@\t@'

以防万一您确实是偶然从空格开始的(尽管我/ think /这通常是“缺少分隔符”错误)。


3

我遇到了同样的错误。经过努力,我发现这归因于文件夹名称中的“空格”。

例如 :

之前,我的文件夹名称是: “ Qt Projects”

后来我将其更改为: “ QtProjects”

我的问题解决了。

它非常简单,但有时是一个重大问题。


0

我遇到了这个问题(目标名称中的冒号),因为-n我的GREP_OPTIONS环境变量中有问题。显然,这导致configure生成Makefile错误。


0

我的IDE在我的Makefile中混合了空格和制表符。

将我的Makefile设置为仅使用选项卡可以为我解决此错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.