【问题标题】:Missing separator in Makefile?Makefile中缺少分隔符?
【发布时间】:2012-03-23 17:54:54
【问题描述】:

以下 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有demo用到的一组方法。

我将 -c 标志添加到 lib.但是,当我运行 make 时,我得到:

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

【问题讨论】:

  • “不工作”是什么意思?你得到什么错误?怎么了?什么没有发生?
  • @Kobi,这几乎可以肯定是因为您的命令行不以制表符开头。详情见我的回答。

标签: c makefile


【解决方案1】:

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

您可以通过以下成绩单看到这一点。在文件中,$(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,假设您的评论中的Makefile 是文件名,您可能还需要考虑为makefile*.mk 也这样做(以及任何其他make 文件您要使用的变体)。
  • 在我的情况下需要一个标签。
【解决方案2】:

你有没有错过${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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      尝试将其更改为:

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

      【讨论】:

      • 谢谢,但问题仍然存在。我想将 lib 链接到 main 以便它知道它可以使用 lib 中的函数。
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        由于main 依赖于lib

        demo: lib demo.c
        

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

        【讨论】:

          【解决方案7】:

          缩进是我的问题。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-03-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-13
            • 2012-12-16
            相关资源
            最近更新 更多