makefile:4: *** 缺少分隔符。停止

Posted

技术标签:

【中文标题】makefile:4: *** 缺少分隔符。停止【英文标题】:makefile:4: *** missing separator. Stop 【发布时间】:2013-05-31 16:07:15 【问题描述】:

这是我的生成文件:

all:ll

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

clean :
  \rm -fr ll

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

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

我该如何解决?

【问题讨论】:

您可以使用 .RECIPEPREFIX 更改字符 make 使用。见:gnu.org/software/make/manual/html_node/… 这怎么不是作为重复关闭的??? Make error: missing separator 的可能重复项 在 mcedit 的“选项 -> 常规”中确保“假半制表符”在该选项之前的方括号中没有“X”。 谢谢! MC 中的半空格是问题所在! 在 vim 中,使用:Ctrl+V + Tab 【参考方案1】:

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

【讨论】:

"cat -e -t -v makefile_name" 是最好的。曾经。我一直盯着屏幕,看到看起来像一个标签的东西,完全没有意识到它是整个文件中使用空格而不是硬标签的一行。 当使用 vi(或 vim)编辑器从一个 makefile 复制/粘贴到另一个时,请确保不要意外抓住指示文件结尾的 ~(波浪号)行。一个真正的 ~ 看起来像一个 vi 标记,会导致“*** 缺少分隔符。停止。”错误。这可能看起来很明显,但当它意外发生时,它远非显而易见。请参阅my blog commentary 了解更多信息。 -v 选项用于cat 命令在这里是多余的,因为-e 表示-vE-t 表示-vT 这并不比 Python 需要空格来控制流,或者 C 需要由某些字符组成的标识符,或者英语需要元音更“愚蠢”。这只是一个规则。 @JuhaUntinen 不,它从未改变过,不,它不能正常工作。【参考方案2】:

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

【讨论】:

VS Code 识别出我的 'common.mk' 文件,从无后缀的 'Makefile' 中提取是一个 make 文件,并正确突出显示它 - 但悄悄地开始使用空格而不是制表符缩进。 这在我选择“将缩进转换为制表符”时有效【参考方案3】:

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

在您的情况下,这适用于 gcc 行(第 4 行)。您需要在gcc 之前插入制表符。

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

【讨论】:

要非常清楚,必须有一个硬制表符作为每个逻辑配方行的第一个字符。在 TAB 之后,您可以添加任何类型的空格。 tabspace应该等于2还是4?在 /.vimrc 中设置 tabstop = 2 还是 4? @RahulReddy 编辑器如何显示选项卡与配置中是否存在制表符无关。【参考方案4】:

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

    打开Preferences (cmd + ,) 转到Plugins -> Marketplace 搜索Makefile support,安装并重启IDE。

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

【讨论】:

这对 GoLand 也有帮助 我发现 IDE 很重要。 pycharm 不支持标签版。当我更改为 ATOM 时,TAB 输入有效。 如果您的 IDE 自动使用空格缩进,您可以使用 \u09 输入 unicode 选项卡,在某些 Linux 桌面环境中,可以使用 Ctrl+Shift+U 然后键入“09”来完成. “”。不过这不是很有趣。【参考方案5】:

使用.editorconfig 自动修复标签:

root = true

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

[Makefile]
indent_style = tab

【讨论】:

不适合我【参考方案6】:

TLDR;

makefile 语法可能很古怪 如果您希望将一行代码解释为 make 代码,则它只能缩进 空格。 如果您希望将一行代码解释为bash 代码,则只能使用 tabs

缩进
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

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

【讨论】:

【参考方案7】:

这是一个相当古老的问题,但我仍然想多说一个选项,使用 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$

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

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

    转到首选项>编辑器>代码样式 在这里您需要选择与您的问题相关的文件类型。但很可能您需要选择Other File Types。 在打开的选项卡中标记Use tab character 的复选框并注意Tab sizeIndent 的值必须为4。

【讨论】:

【参考方案10】:

如果您使用 mcedit 进行 makefile 编辑。您必须看到以下标记。

【讨论】:

【参考方案11】:

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

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

并删除检查

"用空格替换制表符"

【讨论】:

【参考方案12】:

如果你在 eclipse 中编辑你的 Makefile:

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

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

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

【讨论】:

【参考方案13】:

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

【讨论】:

什么?需要解释一下吗?【参考方案14】:

如果有人遇到过这个问题

*** missing separator.  Stop.

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

【讨论】:

【参考方案15】:

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

您可以在添加标签之前使用:set noet 即(从空格切换到TAB)来完成。

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

进行更改后,您可以使用 :set et 切换回来

【讨论】:

以上是关于makefile:4: *** 缺少分隔符。停止的主要内容,如果未能解决你的问题,请参考以下文章

出错:缺少分隔符

makefile错误***缺少分隔符。停止

make命令makefile出错:18:***缺少分隔符。停止

Makefile:2: *** 缺少分隔符。停止。我该如何解决这个问题我是 Raylib for C++ 的新手

熊猫:用缺少分隔符分隔两列[关闭]

*** 缺少分隔符会出错