22

在构建开源项目时,我遇到了以下错误:

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 $@
4

7 回答 7

21

当您在规则声明的左侧有一些看起来像模式规则输出(包含 a %)以及看起来像正常输出(no )的东西时,GNU make 会打印该错误消息。例如:%:

%.pat normal:
        @echo $@

所以在你的 Makefile 的第 235 行,你已经设法把“看起来像”那个结构的东西放在一起。为避免该错误,请修复该声明,很可能将其分为两部分:

%.pat:
        @echo $@

normal:
        @echo $@

如果没有看到产生此错误的完整生成文件,我们就无法为您提供更多建议。

于 2012-12-19T05:09:58.990 回答
15

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

于 2014-12-09T09:01:51.950 回答
10

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

%.o: %.cpp:
     g++ -c -o %@ $<
于 2016-02-22T19:43:32.687 回答
5

我自己也有这个,这是由于变量定义中的“/”之后的隐藏空间,即

#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
于 2018-04-23T10:52:58.647 回答
3

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

正如 Eric 所建议的那样,解决方法确实是拆分规则。

于 2013-02-25T19:13:26.653 回答
1

完成Eric Melski 的回答后,您可以这样做以避免到处重复代码:

define DEFAULTTARGET :=
    @echo $@
endef

%.pat:
    ${DEFAULTTARGET}

normal:
    ${DEFAULTTARGET}
于 2019-10-13T00:43:33.803 回答
0

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

于 2021-03-10T10:05:08.707 回答