Ошибка: отсутствует разделитель
Я получаю следующую ошибку 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
который отлично работает...