混合隐式和普通规则的错误

时间:2012-12-19 03:28:33

标签: makefile

构建开源项目时遇到错误:

make  subdir=manual -C manual ..=../ subdir_lib
Makefile:235: *** mixed implicit and normal rules.  Stop.

Makefile第235行的代码如下:

235: $(objpfx)stubs ../po/manual.pot $(objpfx)stamp%:
236:    $(make-target-directory)
237:    touch $@

7 个答案:

答案 0 :(得分:14)

当你看起来像模式规则输出(包含%)以及看起来像普通输出(没有%)的东西时,GNU make会打印该错误消息规则声明中:的左侧。例如:

%.pat normal:
        @echo $@

因此,在Makefile的第235行,您已经设法将构成的“看起来像”的东西组合在一起。为避免错误,请修复该声明,最有可能将其拆分为两个:

%.pat:
        @echo $@

normal:
        @echo $@

如果没有看到产生此错误的完整makefile,我们可以提供更多建议。

答案 1 :(得分:14)

我在这里提醒继任者,检查你的路径,其中是否有空间? 我们整个下午都浪费了!

答案 2 :(得分:7)

在我的情况下,错误是由于愚蠢地放置了一个无关的:在依赖行的末尾:

%.o: %.cpp:
     g++ -c -o %@ $<

答案 3 :(得分:2)

此问题中已描述此问题中描述的问题 http://sourceware.org/bugzilla/show_bug.cgi?id=11873

修正案确实是按照Eric的建议拆分规则。

答案 4 :(得分:1)

刚刚拥有这个,这是因为&#34; /&#34;之后的隐藏空间。在变量定义中,即

#accidental/invisible space left after the final "/" i.e...
DESTDIR=path/to/the/destination/directory/ 
#                            ...just here ^

#rule to make copies of text files...
$(DESTDIR)%.txt:$(SRCDIR)%.txt

答案 5 :(得分:0)

完成Eric Melski答案,您可以这样做以避免在各处重复编写代码:

define DEFAULTTARGET :=
    @echo $@
endef

%.pat:
    ${DEFAULTTARGET}

normal:
    ${DEFAULTTARGET}

答案 6 :(得分:0)

检查您的路径,检查您保存项目的位置,目录名称中不应有空格。如果您是从其他来源导入的,请将其与系统生成的项目目录文件一起保存