这是我的生成文件:
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.
我该如何解决?
Ctrl+V + Tab
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
在 VS Code 上,只需单击右下角的“空格:4”,然后在编辑 Makefile 时将其更改为选项卡。
默认情况下,您应该始终在 Tab 之后编写命令,而不是空格。 This can be changed to another character with .RECIPEPREFIX
variable。
在您的情况下,这适用于 gcc
行(第 4 行)。您需要在 gcc
之前插入标签。
还将 \rm -fr ll
替换为 rm -fr ll
。在此命令之前也插入制表符。
PyCharm
的解决方案是安装 Makefile support
插件:
打开 Preferences (cmd + ,) 转到 Plugins -> Marketplace 搜索 Makefile 支持,安装并重新启动 IDE。
这应该可以解决问题并为生成文件提供语法。
使用 .editorconfig
自动修复标签:
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 4
[Makefile]
indent_style = tab
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
从技术上讲,它是决定解释器的主要缩进。
这是一个很老的问题,但我仍然想再说一个使用 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$
您以“空格,空格”而不是“制表符”开始第 4 行 - 仅此而已。
如果你们中的任何人使用 Intellij 的产品,解决方案如下:
在此处转到首选项>编辑器>代码样式,您需要选择与您的问题相关的文件类型。但很可能您需要选择其他文件类型。在打开的选项卡中标记使用制表符的复选框并注意,制表符大小和缩进值必须为 4。
关键是“硬标签”
检查您是否使用 TAB 而不是空格 检查您的 .vimrc 是否设置 tabstop=X
https://i.stack.imgur.com/5uuPV.png
https://i.stack.imgur.com/EJX2C.png
这是因为制表符被空格替换。要禁用此功能,请转到
gedit->编辑->首选项->编辑器
并删除检查
“用空格替换选项卡”
如果您在这里搜索如何使您添加的选项卡和新行可以被 vim 理解,您必须首先在 vim 中启用选项卡。
您可以在添加制表符之前使用 :set noet
即(从空格切换到制表符)来执行此操作。
使用此命令,您的选项卡将看起来像其他选项卡(即 ^I),并且来自 make 的 *** missing separator. Stop.
错误将消失 :)
进行更改后,您可以使用 :set et
切换回来
如果您在 Eclipse 中编辑 Makefile:
Windows-> Preferences->General->Editor->Text Editors->Show Whitespace Characters -> Apply
或使用如下所示的快捷方式。
Tab 将由灰色“>>”表示,Space 将由灰色“.”表示如下图。
https://i.stack.imgur.com/CrXbB.png
为简单起见,使用 -A 或 --show-all 显示所有内容。
如果您的编辑器/IDE 支持,请帮自己一个忙,让它成为 .editorconfig
的永久成员(它可能支持!)
[Makefile]
indent_style = tab
如果有人遇到这个问题
*** missing separator. Stop.
在构建期间,他们应该仔细检查他们的文件系统源路径,它不应该包含特殊字符,如“#”
例如路径
/home/user/#my_sources/
可能无效
cat
命令的-v
选项在这里是多余的,因为-e
表示-vE
而-t
表示-vT
。