Зробити помилку: відсутній роздільник


Відповіді:


364

Як зазначено в онлайн-посібнику , найпоширенішою причиною цієї помилки є те, що рядки відступають пробілами, коли makeочікуються символи вкладки.

Правильно

target: 
\tcmd

де \tTAB (U + 0009)

Неправильно

target:
....cmd

де кожен .являє собою SPACE (U + 0020).


4
Ви можете використовувати .RECIPEPREFIX, щоб змінити використання символів. Дивіться: gnu.org/software/make/manual/html_node/…
aseq

16

Просто для посмішок, і якщо хтось інший зіткнеться з подібною помилкою:

У мене з’явилася сумнозвісна помилка "відсутній роздільник", оскільки я викликав правило, яке визначає функцію як

($eval $(call function,args))

а не

$(eval $(call function,args))

тобто, ($а не $(.


Що? :) Я думаю, у вас там не було 0x20"простору", це правильно?
користувач35443

3
@ user35443 Розміщення$
smac89

8

Це синтаксична помилка у вашому Makefile. Це досить важко бути більш конкретним, ніж це, не бачачи самого файлу чи відповідної його частини.


5

Для мене проблема полягала в тому, що я мав деякі # ...коментарі в кінці рядка, вбудовані в визначення define ... endefбагаторядкової змінної. Видалення коментарів призвело до усунення проблеми.


Дякую. Я не знав, що коментарі до defineдирективи розглядаються буквально. Насправді поведінка не пояснюється в документації . (Для наочності: Вставлення знака числа #в директиву саме по собі не є синтаксичною помилкою. Але це просто не трактується як початок коментаря, тому це,
мабуть,

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

У моєму випадку ця помилка була викликана відсутністю простого простору. У мене це було, якщо блок в моєму файлі:

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

яка мала бути:

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

з пробілом після if.



-1

Отож, мабуть, мені все було потрібний пакет "build-basic", потім спочатку запустити 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.