在尝试安装该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
您遇到的错误:
*** 缺少分隔符(您是指 TAB 而不是 8 个空格吗?)。停止。
意味着makefile
包含空格而不是制表符。众所周知,该make
实用程序对使用Space代替非常挑剔Tab。因此,很可能makefile
包含Space在文件内规则节的开头。
例子
假设我有以下 3 个.c
文件:
char *
hello()
{
return "Hello";
}
世界.c
char *
world()
{
return "world";
}
主程序:
#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为实际的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!
参考
答案2
正如另一个答案所建议的,Makefile 需要制表符,而不是空格字符。我设置.vimrc
为自动用空格替换所有制表符,因此我必须在各个 Makefile 中手动设置相反的设置。我使用的命令vim
如下:
:%s/^[ ]\+/\t/g
答案3
注意:处理这个特定问题的正确方法是更正 Makefile,使每个配方的每个操作行都使用单个制表符缩进,然后向原始开发人员提交补丁。
这是一个丑陋的 hack,它适用于最新版本的 GNU make
(如果问题是 Makefile 始终使用空格而不是制表符):
make '.RECIPEPREFIX+='
这会将特殊的 GNUmake
变量设置.RECIPEPREFIX
为单个空格。从 GNU 3.82 左右(2007 年)开始,此变量make
控制用于为配方操作行添加前缀的字符。如果变量为空(默认情况下),则使用制表符。
例子,
$ cat Makefile
all:
echo hello
$ make '.RECIPEPREFIX+='
echo hello
hello
示例,显示其用法>
(在本例中设置 Makefile 内的变量):
$ cat Makefile
.RECIPEPREFIX = >
all:
> echo hello
$ make
echo hello
hello
也可以看看:
- 其他特殊变量在 GNU
make
手册中。
答案4
我的问题是我有
.PHONY foo
而且,我应该有
.PHONY: foo
我收到这个错误,
❯ make foo
Makefile:1: *** missing separator. Stop.