makefile: 4: *** пропущений роздільник. Стій


473

Це мій makefile:

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/…
aseq

2
Як це не було закрито як дублікат ??? Можливий дублікат помилки Make: пропущений роздільник
jww

У mcedit "Параметри -> Загальне" переконайтесь, що "Підроблені половинки" не мають "X" у квадратних дужках перед цим параметром.
Йован Ружич

Відповіді:


991

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

Копіюючи / вставляючи з одного makefile в інший за допомогою редактора vi (або vim), не забудьте випадково схопити рядок ~ (tilde), що вказує кінець файлу. Справжній ~ схожий на маркер vi і спричинить "*** пропущений роздільник. Стоп." помилка. Це може здатися очевидним, але коли це трапляється випадково, це далеко не очевидно. Дивіться коментар до мого блогу для отримання додаткової інформації.
Скотт

3
-vВаріант catкоманди тут зайвий, оскільки -eзасоби -vEта -tзасоби -vT.
xxks-kkk

2
Ось символ вкладки, якщо хтось використовує редактор, який замінює вкладки, скопіюйте його звідси:.
Іван Борщов

32

У коді VS просто натисніть «Пробіл: 4» у прямому куті та змініть його на вкладку під час редагування Makefile.


1
Я навіть цього не помічав - дякую за цю інформацію. Раніше я використовував регулярну функцію пошуку-заміни, але це набагато приємніше.
Арахіс

Код VS визнав, що мій файл 'common.mk', витягнутий із суфіксу 'Makefile', був файлом make, і правильно його виділив - але тихо почав відступати з пробілами замість вкладок.
Френсіс Нортон

Дякую за допомогу! Я точно не помітив, що в цьому нижньому куті були налаштування вкладок.
se_brandon

28

Ви завжди повинні писати команди після Tabпробілу, а не пробілу.

Це стосується gccрядка (рядок №4) у вашому випадку. Ви повинні вставити вкладку раніше gcc.

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


3
Щоб бути дуже зрозумілим, у кожному рядку логічного рецепта повинен бути жорсткий символ TAB як перший символ. Після TAB ви можете додати будь-який пробіл, який хочете.
MadScientist

чи повинен простір вкладок дорівнювати 2 або 4? в /.vimrc встановити табустоп = 2 або 4?
Рахул Редді

@RahulReddy, як редактор відображає вкладку, не має нічого спільного з тим, чи є в конфігурації символ вкладки чи ні.
xaxxon

Чудова порада, тому що у мене були пробіли спереду. Коли я перевірив це спрацювало.
Чудово

9

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

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

Це має вирішити проблему та надати синтаксис для makefile.


Це також допомагає в GoLand
Vizjerei

Я вважаю справжні справи IDE. Видання вкладки не підтримується в 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 для редагування makefile. Ви повинні побачити наступну позначку. введіть тут опис зображення


0

Це тому, що вкладку замінено пробілами. Щоб відключити цю функцію, перейдіть до

gedit-> редагувати-> налаштування-> редактор

і зняти чек на

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.