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


Ответы:


364

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

Верный

target: 
\tcmd

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

Неправильно

target:
....cmd

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


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

1

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

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

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

станет:

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

1

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


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


0

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

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

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

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

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



-1

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


-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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.