Makefile中缺少分隔符?

时间:2012-03-06 08:59:26

标签: c makefile

以下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具有main函数,lib具有一组演示中使用的方法。

我在-cg中添加了-c标志。但是,当我运行make时,我得到:

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

6 个答案:

答案 0 :(得分:37)

鉴于您对错误的更新,请在${CC}命令之前检查您在线上的内容。许多make程序需要一个真正的制表符,然后放入八个空格(例如)的命令和编辑器会破坏它们。这通常是“缺失分隔符”错误的原因。

您可以通过以下成绩单看到。在文件中,$(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

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

答案 1 :(得分:5)

您是否错过\t之前的某些“标签”(${CC})?

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

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

答案 2 :(得分:1)

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

尝试将其更改为:

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

答案 3 :(得分:1)

相同错误。在此处使用vi时,不会显示特殊字符。

原因很简单: $ {CC}前面应该没有TAB。

答案 4 :(得分:0)

由于main取决于lib

demo: lib demo.c

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

答案 5 :(得分:0)

缩进是我的问题。

我的IDE使用的是TAB字符而不是空格。在vim中打开Makefile,:retab用2个空格重新缩进了一行,然后解决了。