Ошибка: отсутствует разделитель

Я получаю следующую ошибку make:

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

Чем это вызвано?

14 ответов

Решение

Как указано в интерактивном руководстве, наиболее распространенной причиной этой ошибки является то, что строки имеют отступы, когда make ожидает символы табуляции.

Правильный

цель: 
\tcmd

где \ t это TAB

Неправильно

цель:
    CMD

Просто ради ухмылки, и в случае, если кто-то еще столкнется с подобной ошибкой:

Я получил печально известную ошибку "отсутствует разделитель", потому что я вызвал правило, определяющее функцию как

($eval $(call function,args))

скорее, чем

$(eval $(call function,args))

т.е. ($eval $(call... скорее, чем $(eval $(call...,

Это синтаксическая ошибка в вашем Makefile. Довольно сложно быть более конкретным, не видя самого файла или его соответствующих частей.

Для меня проблема заключалась в том, что у меня был какой-то конец строки # ... комментарии, встроенные в define ... endef определение многострочной переменной. Удаление комментариев заставило проблему уйти.

В моем случае эта ошибка была вызвана нехваткой места. У меня было это, если блок в моем make-файле:

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> фактический символ табуляции

Моя ошибка была в строке объявления переменной с многострочным расширением. У меня есть завершающий пробел после "\", что сделало это недопустимым продолжением строки.

MY_VAR = \
   val1 \ <-- 0x20 there caused the error.
   val2

В моем случае ошибка вызвала следующее. Я пытался выполнять команды глобально, т.е. вне какой-либо цели.

UPD. Чтобы выполнить команду глобально, нужно правильно сформировать. Например, команда

ln -sf ../../user/curl/$SRC_NAME ./$SRC_NAME

станет:

$(shell ln -sf ../../user/curl/$(SRC_NAME) ./$(SRC_NAME))

В моем случае такая же ошибка была вызвана тем, что двоеточие: отсутствовал в конце, как в staging.deploy:, Так что учтите, что это может быть легкой синтаксической ошибкой.

У меня был отсутствующий файл разделителя в Makefiles, созданный qmake. Я переносил код Qt на другую платформу. У меня не было набора QMAKESPEC или MAKE. Вот ссылка, по которой я нашел ответ:

https://forum.qt.io/topic/3783/missing-separator-error-in-makefile/5

Просто чтобы добавить еще одну причину, по которой это может появиться:

      $(eval VALUE)

недействителен и приведет к ошибке "отсутствует разделитель".

      $(eval IDENTIFIER=VALUE)

является приемлемым. Такая ошибка обнаружилась у меня, когда у меня был макрос, определенный с помощью defineи попытался сделать

      define SOME_MACRO
... some expression ...
endef

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

где макрос не оценивается как присвоение.

У меня было это, потому что у меня не было толстой кишки после PHONY

Не этот,

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

Но это (обратите внимание на двоеточие)

      .PHONY: install
...

Следующий код Makefile работал:

obj-m = hello.o

all:
    $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 

clean:
    $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

Так что, очевидно, все, что мне было нужно, это пакет build-essential, чтобы потом запустить autoconf во-первых, который сделал Makefile.pre.inтогда ./configure тогда make который отлично работает...

Другие вопросы по тегам