makefile: 4: *** отсутствует разделитель. Стоп

477

Это мой make-файл:

all:ll

ll:ll.c   
  gcc  -c  -Wall -Werror -02 c.c ll.c  -o  ll  $@  $<

clean :
  \rm -fr ll

Когда я пытаюсь make cleanили make makeя получаю эту ошибку:

:makefile:4: *** missing separator.  Stop.

Как я могу это исправить?

Рахул Редди
источник
6
Вы можете использовать .RECIPEPREFIX для изменения характера использования. См: gnu.org/software/make/manual/html_node/...
aseq
2
Как это не было закрыто как дубликат ??? Возможный дубликат ошибки Make: отсутствует разделитель
jww
В mcedit «Параметры -> Общие» убедитесь, что «Фальшивая половина вкладок» не имеет «X» в квадратных скобках перед этой опцией.
Йован Ружич

Ответы:

995

makefile очень глупо связан с вкладками, все действия каждого правила идентифицируются с помощью вкладок. И нет, 4 пробела не делают вкладку, только вкладка делает вкладку.

чтобы проверить я использую команду cat -e -t -v makefile_name

Он показывает наличие вкладок с ^Iи окончания строк с $обоими важны для обеспечения правильного завершения зависимостей, а вкладки отмечают действие для правил, чтобы их было легко идентифицировать с помощью утилиты make.

Пример:

Kaizen ~/so_test $ cat -e -t -v  mk.t
all:ll$      ## here the $ is end of line ...                   
$
ll:ll.c   $
^Igcc  -c  -Wall -Werror -02 c.c ll.c  -o  ll  $@  $<$ 
## the ^I above means a tab was there before the action part, so this line is ok .
 $
clean :$
   \rm -fr ll$
## see here there is no ^I which means , tab is not present .... 
## in this case you need to open the file again and edit/ensure a tab 
## starts the action part
Нитин
источник
8
"cat -e -t -v makefile_name" - лучшая вещь. Когда-либо. Я продолжал смотреть на экран, видя то, что выглядело как вкладка, совершенно не замечая, что это ОДНА ЛИНИЯ во всем файле, которая использует пробелы вместо жесткой вкладки.
arinmorf
Огромное спасибо! Я компилировал исходный код большого проекта. Вставил несколько строк makefileиз учебника, и это не сработало. Только после удаления пробелов и сдачи Tabвместо работало!
rzaaeeff
При копировании / вставке из одного make-файла в другой с помощью редактора vi (или vim) убедитесь, что случайно не взяли строку ~ (тильда), указывающую конец файла. Реальное ~ выглядит как маркер vi и вызывает "*** отсутствует разделитель. Стоп". ошибка. Это может показаться очевидным, но когда это происходит случайно, это далеко не очевидно. Смотрите мой блог для получения дополнительной информации.
Скотт
3
-vопция для catкоманды здесь избыточна, потому что -eозначает -vEи -tозначает -vT.
xxks-kkk
2
Вот символ вкладки, если кто-то использует редактор, который заменяет вкладки, скопируйте и вставьте его отсюда:.
Иван Борщов
32

В VS Code просто нажмите «Пробел: 4» в правом углу и измените его на вкладку при редактировании вашего Makefile.

alanwsx
источник
1
Я даже не заметил этого там - спасибо за эту информацию. Ранее я использовал регулярное выражение найти-заменить, но это намного приятнее.
Арахис
VS Code распознал, что мой файл common.mk, извлеченный из файла Makefile без суффикса, был файлом make, и правильно выделил его, но тихо начал отступать вместо пробелов вместо пробелов.
Фрэнсис Нортон
Спасибо за помощь! Я определенно не заметил, что в этом нижнем углу были настройки вкладок.
se_brandon
28

Вы должны всегда писать команду после а, Tabа не пробела.

Это относится к gccстроке (строка № 4) в вашем случае. Вы должны вставить вкладку раньше gcc.

Также замените \rm -fr llна rm -fr ll. Вставьте вкладки перед этой командой тоже.

Денни Мэтью
источник
3
Чтобы быть очень ясным, должен быть жесткий символ TAB в качестве первого символа в каждой строке логического рецепта. После вкладки вы можете добавить любой пробел по своему усмотрению.
Безумный ученый,
должно ли TabSpace быть равно 2 или 4? в / .vimrc установить tabstop = 2 или 4?
Рахул Редди
@RahulReddy, то, как редактор отображает вкладку, не имеет никакого отношения к тому, есть или нет символ вкладки в конфигурации.
xaxxon
Отличный совет, потому что у меня были пробелы спереди. Когда я проверил это сработало. Превосходно :)
indianwebdevil
9

Решением PyCharmбыло бы установить Makefile supportплагин:

  1. Открыть Preferences( cmd + ,)
  2. Перейти к Plugins->Marketplace
  3. Найдите Makefile support, установите и перезапустите IDE.

Это должно решить проблему и предоставить синтаксис для make-файла.

Томаш Бартковяк
источник
Это также помогает в GoLand
Vizjerei
Я нахожу IDE реальными вопросами. Tab Edition не поддерживается в Pycharm. Когда я переключаюсь на ATOM, ввод TAB работает.
Лунный рыцарь
6

Это довольно старый вопрос, но все же я хотел бы сказать еще об одном варианте использования vi/vimредактора для визуализации вкладок. Если вы vi/vimустановили, откройте Makefile(например vim Makefile) и введите :set list. Это покажет количество вкладок, вставленных, как показано ниже,

 %-linux: force$
^I@if [ "$(GCC_VERSION)" = "2.96" ] ; then \$
^I^Iecho ===== Generating build tree for legacy $@ architecture =====; \$
^I^I$(CONFIGURE) $(CWD) $@ legacy; \$
^Ielse \$
^I^Iecho ===== Generating build tree for $@ architecture =====; \$
^I^I$(CONFIGURE) $(CWD) $@; \$
^Ifi$
^Icd build-$@;make$
Панч
источник
6

Использование .editorconfigдля автоматического исправления вкладок:

root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 4

[Makefile]
indent_style = tab
Даниэль В.
источник
4

Ключевым моментом было «HARD TAB» 1. Проверьте, использовали ли вы TAB вместо пробелов 2. Проверьте .vimrc на «set tabstop = X»

wlsherica
источник
2

Если кто-либо из вас использует продукт от Intellij, решение для этого заключается в следующем:

  1. Перейдите в «Настройки»> «Редактор»> «Стиль кода».
  2. здесь вам нужно выбрать тип файла, связанный с вашей проблемой. Но, скорее всего, вам нужно выбрать Other File Types.
  3. На открывшейся вкладке установите флажок Use tab characterи будьте внимательны, Tab sizeи Indentзначения должны быть 4.
Богдан Александру Милитару
источник
2

Если вы используете mcedit для редактирования make-файла. Вы должны увидеть следующую отметку. введите описание изображения здесь

ригуан чжэн
источник
0

Это потому, что табуляция заменяется пробелами. Чтобы отключить эту функцию, перейдите на

gedit-> Edit-> Настройки-> редактор

и удалите чек на

" заменить вкладку пробелом "

Шринивас Патгар
источник