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

这是我的makefile:

all:ll ll:ll.c gcc -c -Wall -Werror -02 cc ll.c -o ll $@ $< clean : \rm -fr ll 

当我尝试make cleanmake make ,我得到这个错误:

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

我该如何解决?

makefile与标签有一个非常愚蠢的关系,每个规则的所有行为都由标签标识……并且没有4个空格不做标签,只有一个标签使标签…

检查我使用命令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 cc ll.c -o ll $@ $<$ ## the ^I above means a tab was there before the action part, so this lines 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 

希望这可以帮助 !!

你应该总是写一个“标签”而不是空白的命令。

这适用于你的情况下的“gcc”行(第4行)。 你需要在gcc之前插入tab。

另外用“rm -fr ll”replace\ rm -fr ll。 在这个命令之前插入标签

在VS Code上,点击右上angular的“Space:4”,在编辑你的Makefile文件时将其改为Tab。

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

它的老问题,但我仍然想谈谈使用vi/vim编辑器可视化标签的更多选项。 如果你安装了vi/vim然后打开一个Makefile (例如vim Makefile )并input: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$ 

这是因为制表符被replace为空格。 要禁用此function,请转到

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

并删除检查

用空格replace标签