C Makefile中缺少分隔符?

C Makefile中缺少分隔符?,c,makefile,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具有主函数,lib具有一组用于Demo的方法 我在lib中添加了-c标志。但是,当我运行make时,我得到: Makefile:5: *** missing separat

下面的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.

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

尝试将其更改为:

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

如果更新时出现了错误,请检查这些
${CC}
命令之前的行中的内容。许多
make
程序需要一个真正的制表符,然后放入八个空格(例如)的命令和编辑器才能将其打断。这往往是“缺少分隔符”错误的原因

你可以从下面的文字记录中看到这一点。在文件中,
$(xyzy)
前面有四个空格:

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

pax> make
makefile:3: *** missing separator.  Stop.
但是,当我编辑它并将这四个空格转换为一个选项卡时,效果很好:

pax> make
echo hello
hello

您尝试将源文件组合在一起的方式也有问题

如果没有
-c
标记到
gcc
,它将尝试从这些命令中创建一个单独的可执行文件,几乎肯定会导致链接器错误。您将需要类似(简单)的内容:

或者(稍微复杂一点):


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

因为
main
依赖于
lib

demo: lib demo.c

${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

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

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

缩进是我的问题


我的IDE使用了制表符而不是空格。在vim中打开Makefile,a
:retab
用2个空格重新插入该行,这就解决了。

你说的“不工作”是什么意思?你犯了什么错误?发生了什么事?什么事情没有发生?@Kobi,这几乎可以肯定,因为您的命令行不是以制表符开头的。有关详细信息,请参见我的答案。谢谢,但问题仍然存在。我想将lib链接到main,以便它知道它可以使用lib中的函数。我已将此添加到
.editorconfig
:[Makefile]indent\u style=tab indent\u size=4@DUzun假设您的注释中的<代码> Maxfile 是文件名,您可能还需要考虑为<代码> Aufffile 和<代码> *.MK < /代码>。(以及您想要使用的任何其他make文件变体)。在我的案例中需要一个选项卡。
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
demo: lib demo.c
${CC} ${CFLAGS} lib.c -c -o lib.o
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