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

Ответы:

364

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

Верный

target: 
\tcmd

где \tТАБ (U + 0009)

Неправильно

target:
....cmd

где каждый .представляет пробел (U + 0020).

DFA
источник
4
Вы можете использовать .RECIPEPREFIX для изменения характера использования. См: gnu.org/software/make/manual/html_node/...
aseq
16

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

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

($eval $(call function,args))

скорее, чем

$(eval $(call function,args))

то есть, ($а не $(.

Крейзи Глеу
источник
Какой? :) Я думаю, у вас не было 0x20"места" там, это правильно?
user35443
3
@ user35443 Размещение$
smac89
8

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

размотать
источник
5

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

Гуго
источник
Спасибо. Я не знал, что комментарии в defineдирективе трактуются буквально. На самом деле поведение не объясняется в документации . (Для ясности: Встраивание номер знака #. В директиве не сама ошибка синтаксиса Но это просто не интерпретируется как начало комментария, таким образом , что, по общему признанию ошибок.)
YNN
3

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

MY_VAR = \
   val1 \ <-- 0x20 there caused the error.
   val2
JHarveyJr
источник
1

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

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

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

станет:

$(shell ln -sf ../../user/curl/$(SRC_NAME) ./$(SRC_NAME))
yuliskov
источник
1

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

Pratik
источник
1

В моем случае я фактически пропустил вкладку между ними 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>это фактический символ табуляции

Nena
источник
0

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

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

который должен был быть:

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

с пробелом после if.

Хасимото
источник
0

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

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

JulieC
источник
-1

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

Kl3m Михард
источник
-2

Следующий код 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
Джайшри Алавандар
источник