Makefile中的错误:***缺少分隔符。停止。

36

我在CentOS 6.02 64位系统中使用makefile时出现错误。我需要知道如何使makefile可用。任何建议都将非常有帮助。我的makefile如下:

#



.SUFFIXES: .cc $(.SUFFIXES)



ALL = libpal.a



#all = $(ALL)

all: $(ALL)



.cpp.o:

            $(C++) -o $@ -c $(PROF) $(CFLAGS) $*.cpp

.cc.o:

            $(C++) -o $@ -c $(PROF) $(CFLAGS) $*.cc

.c.o:

            $(CC) -o $@ -c $(PROF) $(CFLAGS) $*.c



top_srcdir = ..

OPENSSL_LIB_DIR = ../../ThirdPartyLibs/openssl-0.9.8e/include
BOOST_DIR = ../../ThirdPartyLibs/boost/stage/lib

BOOST_INCLUDE_DIR = ../../ThirdPartyLibs/boost





CC = gcc

C++ = g++

CCOPT = -Os -Wall -Wno-deprecated

CCOPT_DEBUG = -Wall -g -Wno-deprecated

PROF = 



STATIC = -static





INCLUDE = \
 -I./usr/include/sys

 -I./Headers \

 -I$(top_srcdir)/PAL/Headers \

 -I$(top_srcdir)/BaseMulti/Headers \

 -I$(top_srcdir)/NetworkMulti/Headers \

 -I$(top_srcdir)/RTP/Headers \

 -I$(BOOST_INCLUDE_DIR) \

 -I$(OPENSSL_LIB_DIR) \



LIBDIRS = \

    -L$(BOOST_DIR) \





#XXX NLAYER define / MB_DEBUG

DEFINE =  -D_LINUX -DDEBUGLOG -D_INDENT_DB_PRINT -fsigned-char -fno-inline -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -D_POSIX_PER_PROCESS_TIMER_SOURCE -D_PTHREADS -DUNICODE #-DDISABLE_LOG



SHLIB_SUFFIX   = .so

SHLIB_LD       = gcc -shared

SHLIB_LD_LIBS  = 

SHLIB_CFLAGS   = -fPIC



BFLAGS = $(DEFINE) $(INCLUDE)

CFLAGS = $(CCOPT) $(BFLAGS)



OBJ_C =



OBJ_CC = \

    ./Sources/PALsystime.o \

    ./Sources/PALdebug.o \

    ./Sources/PALdebuglog.o \

    ./Sources/PALthread.o \

    ./Sources/PALcritsec.o \

    ./Sources/PALprofiler.o \

    ./Sources/PALserializable.o \

    ./Sources/PALinet.o \

    ./Sources/PALnetwork.o \

    ./Sources/PALsocket.o \

    ./Sources/PALlocalhostUdpEvent.o \

    ./Sources/PALpollarray.o \

    ./Sources/PALrandom.o \



OBJS = $(OBJ_C) $(OBJ_CC) 



SRCS = $(OBJ_C:.o=.c) $(OBJ_CC:.o=.cc)



debug: DEFINE += -DDEBUG

debug: BFLAGS = $(DEFINE) $(INCLUDE)

debug: CFLAGS = $(CCOPT_DEBUG) $(BFLAGS)

debug: $(OBJS)

    ar crsu libpal_debug.a $(OBJS)



libpal.a: $(OBJS)

    ar crsu libpal.a $(OBJS)



cleandeps:  

    $(RM) ./Sources/*.o .depend* core



clean: cleandeps    

    $(RM) ./libpal.a ./libpal_debug.a

    $(RM) $(ALL)

结果产生的错误为:

Makefile:34: *** missing separator.  Stop.
3个回答

49

您可以在附录B-由Make生成的错误中找到此错误的解释。

每个配方中的每一行都必须以一个制表符开始。您文件顶部开始的使用$(C++)$(CC)的配方似乎没有以制表符开头。

另外,该部分内容为:

INCLUDE = \
    -I./usr/include/sys
    -I./Headers \

sys 后面似乎缺少一个反斜杠,并且同一节(以及许多其他节)有很多多余的空行。


你是否收到完全相同的错误?如果是,那么第34行具体指哪一行?另外,你应该删除一些多余的空行。另外,行-I./usr/include/sys似乎缺少一个反斜杠,而其他行却有一个额外的反斜杠。 - Reinier Torenbeek
你删除了空行吗? - Reinier Torenbeek
友情提示给使用Sublime Text的人,请确保您的制表符设置如此问题所示。请仔细检查您的文本编辑器设置。还要确保您的Makefile在正确的目录中(尽管如果它在错误的目录中,它会抛出不同的错误)。 - aug
在使用vi(或vim)编辑器从一个makefile复制/粘贴到另一个makefile时,请确保不要意外地抓取表示文件结尾的(波浪号)行。真正的看起来像是vi标记,并会导致“***缺少分隔符。停止。”错误。这可能似乎很明显,但当它意外发生时,它远非明显。 有关更多信息,请参见我的博客评论 - Scott

26

与使用 gedit 等编辑器相比,在 vim 中打开您的 makefile。食谱中的每一行都必须以制表符开始。


7
+1 简单直接。当然,我已经配置了我的 vim 使得使用两个空格 (0x20) 代替制表符。我不得不查阅 ASCII 表才找到相关的控制字符 (0x09,或者 ^I,因为 'I' 是字母表中的第9个字符)。所以,对于其他处于类似情况的人来说,在插入模式下通过^V^I (Ctrl-V, Ctrl-I) 是一个简单的方法来插入一个制表符。另外,我必须问一下是谁有如此 杰出 的想法强制要求你使用制表符。连 Python 对空白都没有那么严格 :P - Braden Best
1
@BradenBest make 不强制使用制表符,它只是默认字符,用于指示配方的开始。如果您不喜欢这个字符,只需将.RECIPEPREFIX设置为其他值即可。当然,没人会理解如何处理您的 makefile,但您只需强制他们阅读文档 :-). - Reinier Torenbeek

7

这篇回答是为了其他像我一样的Make新手而写的,他们通过谷歌搜索找到了这个问题,并且因为修改一个没有以空格字符开头的大型预先存在的Makefile而陷入困境。我的问题出现在子目录中有一个带有空格而不是制表符的makefile被父级makefile调用,我错误地认为问题存在于其中。

一旦我修复了子目录中的makefile,一切都像魔术般地解决了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接