693

这是我的生成文件:

all:ll

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

clean :
  \rm -fr ll

当我尝试make cleanormake make时,我收到此错误:

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

我该如何解决?

4

16 回答 16

1428

make 与标签的关系非常愚蠢。每个规则的所有操作都由选项卡标识。而且,不,四个空格不构成一个制表符。只有一个制表符才有制表符。

要检查,我使用命令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
于 2013-06-05T16:27:25.233 回答
82

在 VS Code 上,只需单击右下角的“空格:4”,然后在编辑 Makefile 时将其更改为选项卡。

于 2016-07-18T15:04:59.800 回答
39

Tab您应该始终在 a而不是空格之后编写命令。

这适用gcc于您的情况下的行(第 4 行)。您需要在gcc.

也替换\rm -fr llrm -fr ll. 在此命令之前也插入制表符。

于 2013-06-05T04:59:34.313 回答
15

解决方案PyCharm是安装Makefile support插件:

  1. 打开Preferences( cmd + ,)
  2. 转到Plugins->Marketplace
  3. 搜索Makefile support、安装并重新启动 IDE。

这应该可以解决问题并为生成文件提供语法。

于 2019-01-08T16:09:58.810 回答
13

用于自动.editorconfig修复标签:

root = true

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

[Makefile]
indent_style = tab
于 2019-01-23T10:46:34.967 回答
11

TLDR;


如果您希望将一行代码解释为make只能用空格缩进的代码, makefile 语法可能会很奇怪。
如果您希望将一行代码解释为bash代码,则只能使用制表符缩进

sometask:
  ifeq($FOO,bar)   // this is make code. only spaces
    echo "foobar"  // this is bash code. only tabs
  endif            // again, this is make code. only spaces

从技术上讲,它是决定解释器的主要缩进。

于 2021-03-05T18:13:07.933 回答
8

这是一个很老的问题,但我仍然想再说一个使用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$
于 2017-02-13T02:00:18.410 回答
4

关键点是“HARD TAB” 1. 检查您是否使用了 TAB 而不是空格 2. 检查 .vimrc 是否有“set tabstop=X”

于 2014-11-21T15:05:44.583 回答
4

如果你们中的任何人使用 Intellij 的产品,解决方案如下:

  1. 转到首选项 > 编辑器 > 代码样式
  2. 在这里您需要选择与您的问题相关的文件类型。但很可能您需要选择Other File Types.
  3. 在打开的选项卡中标记复选框Use tab character并小心,Tab sizeIndent必须为 4。
于 2018-06-25T08:47:07.243 回答
3

您以“空格,空格”而不是“制表符”开始第 4 行 - 仅此而已。

于 2022-01-08T01:38:49.967 回答
2

如果您使用 mcedit 进行 makefile 编辑。您必须看到以下标记。 在此处输入图像描述

于 2018-09-17T09:05:56.157 回答
1

这是因为制表符被空格替换。要禁用此功能,请转到

gedit->编辑->首选项->编辑器

并删除检查

用空格替换制表符

于 2016-07-11T05:18:57.167 回答
0

如果您在 Eclipse 中编辑 Makefile:

Windows-> Preferences->General->Editor->Text Editors->Show Whitespace Characters -> Apply

或使用如下所示的快捷方式。

Tab 将由灰色“>>”表示,Space 将由灰色“.”表示 如下图。

在此处输入图像描述

于 2020-09-28T07:07:03.840 回答
0

为简单起见,使用 -A 或 --show-all 显示所有内容。

于 2021-04-10T11:31:36.760 回答
0

如果有人遇到这个问题

*** missing separator.  Stop.

在构建过程中,他们应该仔细检查他们的路径,它不应该包含像“#”这样的特殊字符

于 2021-09-08T19:18:45.650 回答
0

如果您在这里搜索如何使您添加的选项卡和新行可以被 vim 理解,您必须首先在 vim 中启用选项卡。

在添加选项卡之前,您可以使用:set noetie(从空格切换到 TAB)来执行此操作。

使用此命令,您的选项卡将看起来像其他选项卡(即 ^I),并且 *** missing separator. Stop.来自 make 的错误将消失 :)

进行更改后,您可以使用:set et

于 2021-10-08T22:04:19.837 回答