Ошибки в файле make: *** отсутствующий разделитель. Стоп
Я сталкиваюсь с ошибками в файле make в CentOS 6.02 64 бит. Мне нужно знать, что нужно сделать, чтобы makefile был работоспособным. Любое предложение будет очень полезно. Мой файл будет вставлен ниже: -
#
.SUFFIXES: .cc $(.SUFFIXES)
ALL = libpal.a
#all = $(ALL)
all: $(ALL)
.cpp.o:
$(C++) -o [email protected] -c $(PROF) $(CFLAGS) $*.cpp
.cc.o:
$(C++) -o [email protected] -c $(PROF) $(CFLAGS) $*.cc
.c.o:
$(CC) -o [email protected] -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
#The previous line had "gcc" instead of "frv-uclinux-gcc"
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.
Ответы
Ответ 1
Вы можете найти объяснение этой ошибки в Приложение B Ошибки, созданные с помощью Make.
Каждая строка в рецепте должна начинаться с символа табуляции. Рецепты, начинающиеся с $(C++)
и $(CC)
в верхней части вашего файла, похоже, не начинаются с символа табуляции.
Кроме того, раздел
INCLUDE = \
-I./usr/include/sys
-I./Headers \
Кажется, что отсутствует обратная косая черта после sys
, а в том же разделе (и многом другом) есть лишние пустые строки.
Ответ 2
Откройте свой файл make в vim, а не в редакторах, таких как gedit. Каждая строка в рецепте должна начинаться с символа табуляции.
Ответ 3
Этот ответ для других Make
новичков, таких как я, которые находят этот вопрос из Googling и застревают, потому что они изменяют большой ранее существующий Makefile, без строк, начинающихся с символа пробела. Моя проблема возникла из-за того, что make файл в подкаталоге с пробелами вместо вкладок вызывался родительским make файлом, где я ошибочно считал, что проблема существует.
Как только я исправил make файл в подкаталоге, все работало как шарм.
Ответ 4
Чтобы добавить к ответам выше, иногда их легче забыть, но если в настройках вашего редактора вы включили "расширение вкладок в пробелы" (в vim "set expandtab" в .vimrc), вы получите эту ошибку, Для vim вы можете временно set noexpandtab
, и он должен решить проблему. Для других редакторов вам, возможно, придется перейти к их настройкам и т.д.