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 clean
或make 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 size
和Indent
的值必须为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: *** 缺少分隔符。停止的主要内容,如果未能解决你的问题,请参考以下文章
make命令makefile出错:18:***缺少分隔符。停止