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. 

鉴于您的错误更新,请在${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 

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

你有没有机会在${CC}之前错过一些“tab”( \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 

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

尝试将其更改为:

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

由于main取决于lib

 demo: lib demo.c 

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