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

Rah*_*ddy 397 c makefile

这是我的makefile:

all:ll

ll:ll.c   
  gcc  -c  -Wall -Werror -02 c.c ll.c  -o  ll  $@  $<

clean :
  \rm -fr ll
Run Code Online (Sandbox Code Playgroud)

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

:makefile:4: *** missing separator.  Stop.
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

nit*_*tin 844

makefile与制表符有非常愚蠢的关系,每个规则的所有操作都由制表符标识......而No 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 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
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助 !!

  • "makefile与制表符的关系非常愚蠢,每个规则的所有操作都由制表符标识......而No 4空格不制作制表符,只有制表符制作标签"这对此有很大帮助 (171认同)
  • "cat -e -t -v makefile_name"是最好的选择.永远.我一直盯着屏幕,看到看起来像一个标签,完全忽略了它是整个文件中的ONE LINE,它使用了空格而不是硬标签. (6认同)
  • `cat`命令的`-v`选项在这里是多余的,因为`-e`表示`-vE`而`-t`表示`-vT`. (3认同)
  • 如果有人使用替换制表符的编辑器,这里是制表符,从这里复制粘贴:. (2认同)
  • @JuhaUntinen 不,它从未改变过,不,它也不起作用。 (2认同)
  • `cat -e -t -v Makefile` 可以替换为 `cat -A Makefile` ,相当于 `cat -vET Makefile` (2认同)

Den*_*hew 26

你应该总是在"tab"之后写命令而不是空格.

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

同样用"rm -fr ll"替换\ rm -fr ll.也可以在此命令之前插入标签

  • @RahulReddy 编辑器如何显示选项卡与配置中是否有制表符无关。 (4认同)
  • 要非常清楚,必须有一个硬TAB字符作为每个逻辑配方行中的第一个字符.在TAB之后,您可以添加任何类型的空白. (3认同)

ala*_*wsx 24

在VS Code上,只需单击右下角的"Space:4",然后在编辑Makefile时将其更改为tab.

  • 当我选择“将缩进转换为制表符”时,这有效 (6认同)
  • 它与“将缩进转换为制表符”一起使用 (3认同)

hes*_*aei 13

当你在 VSCode 中创建 Makefile 时,你应该设置 Tab Size: 4在此输入图像描述


Dan*_* W. 10

使用.editorconfig,自动将修复标签:

root = true

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

[Makefile]
indent_style = tab
Run Code Online (Sandbox Code Playgroud)


Pet*_*nec 8

您以“空格,空格”而不是“制表符”开始第 4 行 - 没有其他内容。


Nel*_*les 8

对我来说 2023 只有这个有效。 在此输入图像描述

此后一切正常。


Tom*_*iak 6

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

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

这应该可以解决问题,并提供Makefile的语法。


Pan*_*nch 5

这是一个非常古老的问题,但我仍然想说一下使用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$
Run Code Online (Sandbox Code Playgroud)


Wee*_*ush 5

TLDR;


如果您希望将一行代码解释为make只能用空格缩进的代码,makefile 语法可能很奇怪。
如果您希望将一行代码解释为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
Run Code Online (Sandbox Code Playgroud)

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