Makefile中缺少分隔符?

Kob*_*obi 14 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
Run Code Online (Sandbox Code Playgroud)

Demo具有main函数,lib具有一组演示中使用的方法.

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

Makefile:5: *** missing separator.  Stop.
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 40

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

你可以看到以下成绩单.在文件中,前面有四个空格$(xyzzy):

xyzzy=echo
all:
    $(xyzzy) hello
Run Code Online (Sandbox Code Playgroud)

所以,当我做到这一点时,我会得到与你相同的错误:

pax> make
makefile:3: *** missing separator.  Stop.
Run Code Online (Sandbox Code Playgroud)

但是,当我编辑它并将这四个空格转换为选项卡时,它可以正常工作:

pax> make
echo hello
hello
Run Code Online (Sandbox Code Playgroud)

您还尝试将源文件组合在一起时遇到问题.

如果没有-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
Run Code Online (Sandbox Code Playgroud)

或(稍微复杂一点):

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
Run Code Online (Sandbox Code Playgroud)

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


小智 7

我通过用制表符替换前导空格解决了同样的问题


Gui*_*i13 6

你有没有机会错过一些"tab"(\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
Run Code Online (Sandbox Code Playgroud)