Makefile中缺少分隔符?

39

以下的Makefile无法工作,我不确定出了什么问题。

CC = gcc
CFLAGS = -Wall -g

demo:
    ${CC} ${CFLAGS} demo.c -o demo
lib:
    ${CC} ${CFLAGS} lib.c -o lib
clean:
    rm -f lib demo

Demo包含主要函数,而lib中包含用于demo的一组方法。

我向lib添加了-c标志。然而当我运行make命令时,出现以下错误:

Makefile:5: *** missing separator.  Stop.

2
“不起作用”是什么意思?你遇到了哪些错误?发生了什么?又出现了什么问题? - Mat
2
@Kobi,几乎可以确定是因为您的命令行没有以制表符开头。请参阅我的答案以获取详细信息。 - paxdiablo
这个回答解决了你的问题吗?Make error: missing separator - undefined
7个回答

79

根据您提供的错误更新,请检查在那些${CC}命令之前的行上有什么内容。许多make程序在命令前需要一个真正的制表符,而将八个空格(例如)放入编辑器中将会破坏它们。这往往是“Missing separator”错误的原因。

您可以通过以下记录来看到这一点。在文件中,$(xyzzy)之前有四个空格:

xyzzy=echo
all:
    $(xyzzy) hello

所以,当我运行它时,我得到与你相同的错误:

pax> make
makefile:3: *** missing separator.  Stop.

但是,当我将这四个空格编辑为一个制表符时,它可以正常工作:

pax> make
echo hello
hello

您在尝试合并源文件时也遇到了问题。

如果没有使用-c标志来编译器gcc,它将尝试从每个命令创建单独的可执行文件,几乎肯定会导致链接器错误。您需要像这样的解决方案(简单):

CC = gcc
CFLAGS = -Wall -g

# Just compile/link all files in one hit.
demo: demo.c lib.c
   ${CC} ${CFLAGS} -o demo demo.c lib.c

clean:
    rm -f demo

或(稍微复杂一些):
CC = gcc
CFLAGS1 = -Wall -g -c
CFLAGS2 = -g

# Link the two object files together.

demo: demo.o lib.o
   ${CC} ${CFLAGS2} -o demo demo.o lib.o

# Compile each source file to an object.

demo.o: demo.c
   ${CC} ${CFLAGS1} -o demo.o demo.c

lib.o: lib.c
   ${CC} ${CFLAGS1} -o lib.o lib.c

clean:
    rm -f demo

第一种解决方案的问题在于,即使只有一个过期,它也会不必要地编译两个程序。第二种解决方案则更加智能。

我已将以下内容添加到.editorconfig文件中:[Makefile] indent_style = tab indent_size = 4 - DUzun
1
@DUzun,假设您评论中的Makefile是文件名,您可能还想考虑为makefile*.mk(以及您想要使用的任何其他make文件变体)执行此操作。 - paxdiablo
在我的情况下需要一个制表符。 - DimiDak
我从互联网上复制了一个make文件,将四个空格替换为制表符对我很有帮助。我正在使用Mac,而我复制的代码来自GNU系统教程。 - Explosion

13

你是否有可能在${CC}之前错过了一些“制表符”(\t)?

通常我的编辑器会将制表符替换为空格,因此我会收到此消息。

CC = gcc
CFLAGS = -Wall -g

demo:
[TAB]${CC} ${CFLAGS} demo.c -o demo
lib:
[TAB]${CC} ${CFLAGS} lib.c -o lib
clean:
[TAB]rm -f lib demo

6
我通过将前导空格替换为制表符解决了相同的问题。

3

出现了相同的错误。当我在这里使用vi时,特殊字符不会显示。

原因很简单:${CC}前面应该有一个制表符而不是空格。


2

lib需要编译为库文件而不是程序。

尝试更改为:

main:
    ${CC} ${CFLAGS} main.c lib.o -o main
lib:
    ${CC} ${CFLAGS} lib.c -c -o lib.o

谢谢,但问题仍然存在。我想将lib链接到main中,以便它知道可以使用lib中的函数。 - Kobi

0

由于 main 依赖于 lib

demo: lib demo.c

并且

${CC} ${CFLAGS} lib.c -c -o lib.o

0

缩进是我的问题。

我的IDE使用TAB字符而不是空格。在vim中打开Makefile,执行:retab重新缩进了带有2个空格的行,问题得到解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接