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.


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»


2

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

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

2

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


0

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

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

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

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

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