我得到以下错误运行make:

Makefile:168: *** missing separator.  Stop.

是什么导致了这种情况?


当前回答

在我的例子中,我实际上在ifeq和下一行的命令之间缺少了一个制表符。一开始就没有空间。

ifeq ($(wildcard $DIR_FILE), )
cd $FOLDER; cp -f $DIR_FILE.tpl $DIR_FILE.xs;
endif

本来应该是:

ifeq ($(wildcard $DIR_FILE), )
<tab>cd $FOLDER; cp -f $DIR_FILE.tpl $DIR_FILE.xs;
endif

注意<tab>是一个实际的制表符

其他回答

这是因为在PHONY后面没有冒号

不是这个,

.PHONY install
install:
    install -m0755 bin/ytdl-clean /usr/local/bin

但是这个(注意冒号)

.PHONY: install
...

只是为了笑一笑,以防别人遇到类似的错误:

我得到了臭名昭著的“缺少分隔符”错误,因为我调用了将函数定义为的规则

($eval $(call function,args))

而不是

$(eval $(call function,args))

即($而不是$(。

在我的例子中,这个错误是由于缺乏空间造成的。我在我的makefile中有这个if块:

if($(METHOD),opt)
CFLAGS=
endif

应该是:

if ($(METHOD),opt)
CFLAGS=
endif

if后面加一个空格。

在我的例子中,我实际上在ifeq和下一行的命令之间缺少了一个制表符。一开始就没有空间。

ifeq ($(wildcard $DIR_FILE), )
cd $FOLDER; cp -f $DIR_FILE.tpl $DIR_FILE.xs;
endif

本来应该是:

ifeq ($(wildcard $DIR_FILE), )
<tab>cd $FOLDER; cp -f $DIR_FILE.tpl $DIR_FILE.xs;
endif

注意<tab>是一个实际的制表符

再补充一个出现这种情况的原因:

$(eval VALUE)

无效,将产生“缺少分隔符”错误。

$(eval IDENTIFIER=VALUE)

是可以接受的。当我用define定义宏并尝试执行时,出现了这种错误

define SOME_MACRO
... some expression ...
endef

VAR=$(eval $(call SOME_MACRO,arg))

宏没有计算为赋值。