使抱怨“缺少分隔符(您是说TAB吗?)”


10

在尝试安装som_pak-3.1-NAcMoS.tar.gz文件时,我使用了以下命令:

$ tar xvf som_pak-3.1-NAcMoS.tar.gz
$ cd som_pak-3.1
$ cp makefile.unix makefile
$ make
$ cd ..
$ ln -s som_pak-3.1 $NACMOS_HOME/som_pak

但是在执行make命令时,出现以下错误:

*缺少分隔符(您是指TAB而不是8个空格吗?)。停止。

  • 有人可以告诉我错误的原因吗?
  • 是否需要包含任何软件包?

1
您从哪里下载该文件?
吉尔斯(Gilles)'所以

Answers:


15

您遇到的错误:

***缺少分隔符(您是指TAB而不是8个空格吗?)。停止。

表示makefile包含空格而不是Tab的空格。make众所周知,该实用程序对Space代替的使用很挑剔Tab。因此,很可能在文件中规则节开头的makefile包含Space

假设我有以下3个.c文件:

你好ç
char *
hello() 
{
  return "Hello";
}
世界
char *
world() 
{
  return "world";
}
main.c
#include <stdio.h>

/* Prototypes. */
char *hello();
char *world();

int
main(int argc, char *argv[]) 
{
    printf("%s, %s!\n", hello(), world());
    return 0;
}    

说我有以下几点Makefile

# The executable 'helloworld' depends on all 3 object files
helloworld: main.o hello.o world.o
        cc -o helloworld main.o hello.o world.o # Line starts with TAB!

# Build main.o (only requires main.c to exist)
main.o: main.c
        cc -c main.c # Line starts with TAB!

# Build hello.o (only requires hello.c to exist)
hello.o: hello.c
        cc -c hello.c # Line starts with TAB!

# Build world.o (only requires world.c to exist)
world.o: world.c
        cc -c world.c # Line starts with TAB!

#  Remove object files, executables (UNIX/Windows), Emacs backup files, 
#+ and core files
clean:
        rm -rf  *.o helloworld *~ *.core core # Line starts with TAB!

现在我们尝试建立一个目标

当我针对目标运行它时helloworld

$ make helloworld
makefile:3: *** missing separator (did you mean TAB instead of 8 spaces?).  Stop.

看起来熟悉?

解决问题

您可以通过将更Spaces改为实际Tab字符来解决此问题。我曾经vim修复过我的文件。只需打开它:

$ vim makefile

然后在以下位置运行此命令:

:%s/^[ ]\+/^I/

注意: ^I是一个特殊字符。与+ - + 相比,^其后键入I将被不同地解释。CtrlVCtrlI

这会将以1或更多开头的所有行替换Spaces为real Tab

现在,当我重新运行helloworld目标时:

$ make helloworld
cc -c main.c # Line starts with TAB!
cc -c hello.c # Line starts with TAB!
cc -c world.c # Line starts with TAB!
cc -o helloworld main.o hello.o world.o # Line starts with TAB!

参考文献


尝试使用该vim命令时,找不到E486错误模式
Daniel Jacobson,

@DanielJacobson-如果您有新问题,请提问,评论并不意味着提出新问题。
slm

^我只是在文件本身而不是Tab中创建了^ I
Sun

1

正如另一个答案所建议的,Makefiles需要制表符,而不是空格字符。我.vimrc设置为自动用空格替换所有选项卡,因此我必须在各个Makefile中手动设置相反的设置。vim我使用的命令如下:

:%s/^[ ]\+/\t/g

我使用这个modeline(Makefile中的第一行)# vim: set noet:
Michael D.

0

注意:处理此特定问题的正确方法是更正Makefile,以便使用单个制表符缩进每个配方的每个操作行,然后将其补丁提交给原始开发人员。

这是一个丑陋的骇客,可与最新版本的GNU一起使用make(如果问题是Makefile始终使用空格而不是制表符):

make '.RECIPEPREFIX+='

这会将特殊的GNU make变量.RECIPEPREFIX设置为单个空格。自GNU make3.82左右(2007年)以来,此变量控制用于在配方操作行前添加前缀的字符。如果变量为空(默认情况下为空),则使用制表符。

例,

$ cat Makefile
all:
  echo hello
$ make '.RECIPEPREFIX+='
echo hello
hello

示例,展示其用法>(在这种情况下,在Makefile中设置变量):

$ cat Makefile
.RECIPEPREFIX = >
all:
> echo hello
$ make
echo hello
hello

也可以看看:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.