您遇到的错误:
***缺少分隔符(您是指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!
参考文献