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

293

Это мой 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.

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

  • 5
    Вы можете использовать .RECIPEPREFIX для изменения характера использования. Смотрите: gnu.org/software/make/manual/html_node/…
  • 1
    Как это не было закрыто как дубликат ??? Возможный дубликат ошибки Make: отсутствует разделитель
Показать ещё 1 комментарий
Теги:
makefile

10 ответов

618
Лучший ответ

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

надеюсь это поможет !!

  • 126
    «makefile имеет очень глупую связь с вкладками, все действия каждого правила идентифицируются вкладками ...... и никакие 4 пробела не создают вкладки, только вкладка делает вкладку», это очень помогло
  • 5
    "cat -e -t -v makefile_name" - лучшая вещь. Когда-либо. Я продолжал смотреть на экран, видя то, что выглядело как вкладка, совершенно не замечая, что это ОДНА ЛИНИЯ во всем файле, которая использует пробелы вместо жесткой вкладки.
Показать ещё 8 комментариев
21

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

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

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

  • 2
    Чтобы быть очень ясным, должен быть жесткий символ TAB в качестве первого символа в каждой строке логического рецепта. После вкладки вы можете добавить любой пробел по своему усмотрению.
  • 0
    должно ли TabSpace быть равно 2 или 4? в / .vimrc установить tabstop = 2 или 4?
Показать ещё 2 комментария
19

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

  • 1
    Я даже не заметил этого там - спасибо за эту информацию. Ранее я использовал регулярное выражение найти-заменить, но это намного приятнее.
  • 0
    VS Code распознал, что мой файл common.mk, извлеченный из файла Makefile без суффикса, был файлом make, и выделил его правильно - но тихо начал делать отступы с пробелами вместо вкладок.
Показать ещё 1 комментарий
5

Его довольно старый вопрос, но все же я хотел бы сказать еще об одном варианте с помощью редактора 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$
4

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

2

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

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

и удалите проверку для

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

  • 13
    Где это говорит, что он использует gedit ?
1

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

1

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

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

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

root = true

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

[Makefile]
indent_style = tab
0

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню