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

这是我的makefile:

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.

我怎么才能修好它?

793022 次浏览

默认情况下,您应该始终在Tab之后而不是空白之后写入命令。这可以更改为具有.RECIPEPREFIX变量的另一个字符

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

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

make定义了一个标签需要开始每个食谱。每个规则的所有操作都由制表符标识。如果您希望在食谱前加上制表符以外的字符,您可以将. RECIPEPREFIX变量设置为备用字符。

要检查,我使用命令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

关键点是“硬标签”

  1. 检查您是否使用了TAB而不是空格
  2. 检查您的.vimrc是否为set tabstop=X

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

添加它->编辑->首选项->编辑器

并删除检查

"用空格替换制表符"

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

这是一个非常古老的问题,但我仍然想说使用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$

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

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

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

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

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

这应该可以解决问题并为makefile提供语法。

使用.editorconfig自动修复选项卡:

root = true


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


[Makefile]
indent_style = tab

如果您在Eclipse中编辑Makefile:

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

或者使用下面显示的快捷方式。

制表符将由灰色“>>”表示,空间将由灰色“.”表示,如下图所示。

输入图片描述

TLDR;

makefile语法可以很古怪
如果您希望将一行代码解释为make代码,则必须仅缩进空间
如果您希望将一行代码解释为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

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

如果有人遇到这个问题

*** missing separator.  Stop.

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

例如路径

/home/user/#my_sources/

可能无效

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

您可以在添加制表符之前使用:set noet(即从空格切换到制表符)来完成此操作。

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

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

你用“space, space”而不是“tab”开始第4行-没有别的。

帮自己一个忙,让它成为你的.editorconfig的永久成员,如果你的编辑器/IDE支持它(它可能支持!)

[Makefile]
indent_style = tab

当您在VSCode中创建Makefile时,您应该设置选项卡大小:4输入图片描述