ChatGPT解决这个技术问题 Extra ChatGPT

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

这是我的生成文件:

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”。
在 vim 中,使用:Ctrl+V + Tab

E
Efren

make 定义了一个 tab is required to start each recipe。每个规则的所有操作都由选项卡标识。如果您更喜欢使用制表符以外的字符作为食谱的前缀,则可以将 .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

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

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


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

默认情况下,您应该始终在 Tab 之后编写命令,而不是空格。 This can be changed to another character with .RECIPEPREFIX variable

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

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


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

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

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

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


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

使用 .editorconfig 自动修复标签:

root = true

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

[Makefile]
indent_style = tab

不为我工作
@TejasShetty 它不是为一个人工作,而是为 IDE 工作;-) 如果它不适合你,你需要在你的 IDE 中启用它。
W
WeezyKrush

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

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


P
Panch

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

P
Petr Kosvanec

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


B
Bogdan Alexandru Militaru

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

在此处转到首选项>编辑器>代码样式,您需要选择与您的问题相关的文件类型。但很可能您需要选择其他文件类型。在打开的选项卡中标记使用制表符的复选框并注意,制表符大小和缩进值必须为 4。


D
Daniel W.

关键是“硬标签”

检查您是否使用 TAB 而不是空格 检查您的 .vimrc 是否设置 tabstop=X


r
riguang zheng

https://i.stack.imgur.com/5uuPV.png


h
hesam rajaei

https://i.stack.imgur.com/EJX2C.png


M
Mansuro

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

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

并删除检查

“用空格替换选项卡”


y
yosemite_k

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

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

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

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


R
Rose

如果您在 Eclipse 中编辑 Makefile:

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

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

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

https://i.stack.imgur.com/CrXbB.png


j
jtony

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


什么?介意解释一下吗?
J
Jan Klan

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

[Makefile]
indent_style = tab

L
Lonedone

如果有人遇到这个问题

*** missing separator.  Stop.

在构建期间,他们应该仔细检查他们的文件系统源路径,它不应该包含特殊字符,如“#”

例如路径

/home/user/#my_sources/

可能无效


你能提供更多细节吗?
当您使用空格代替 Tab 时,通常会发生此问题。在大多数编辑器中,都会有一个设置来更改 Tab 到空格的转换。这需要被禁用,或者可以使用记事本++或崇高文本将规则之前的所有空格替换为制表符。
我不确定你们的意思以及您想要什么细节。我的回答与源的路径有关,就我而言,问题是文件系统路径包含特殊字符“#”,问题与源本身的内容无关,也没有提及其他答案中的潜在问题。其他答案中已经详细说明了空格问题。