C Makefile:1:**缺少分隔符。停止

C Makefile:1:**缺少分隔符。停止,c,makefile,C,Makefile,我正在c上创建一个项目,当我创建Makefile并尝试运行它时,会出现以下错误: Makefile:1: *** missing separator. Stop. 我的makefile代码是: CC=gcc OBJ=./objetos INC=./include FON=./aqsFonte BIB=./bibliotecas OPBIB=-lBiblioteca ProjetoFinal: libFinal.a $(CP) $(FON)/ProjetoFinal.c -I$(IN

我正在c上创建一个项目,当我创建Makefile并尝试运行它时,会出现以下错误:

Makefile:1: *** missing separator.  Stop.
我的makefile代码是:

CC=gcc
OBJ=./objetos
INC=./include
FON=./aqsFonte
BIB=./bibliotecas
OPBIB=-lBiblioteca
ProjetoFinal: libFinal.a 
    $(CP) $(FON)/ProjetoFinal.c -I$(INC) -L$(BIB) $(OPBIB) -o ProjetoFinal

Bibliotecas.a: Caminho.o Libs_Defines.o Matrizes.o Proc_Imagens.o Vetores.o
    ar -q $(BIB)/libFinal.a Caminho.o ibs_Defines.o Matrizes.o Proc_Imagens.o Vetores.o

Caminho.o:
    $(CP) $(FON)/Caminho.c -o Caminho.o
Libs_Defines.o :
    $(CP) $(FON)/Libs_Defines.c -o Libs_Defines.o
Matrizes.o:
    $(CP) $(FON)/Matrizes.c -o Matrizes.o
Proc_Imagens.o: 
    $(CP) $(FON)/Proc_Imagens.c -o Proc_Imagens.o
Vetores.o:
    $(CP) $(FON)/Vetores.c -o Vetores.o

另外,我想所有的标签都是正确的。

make对规则和目标缩进的方式非常敏感。您发布的错误通常是由目标规则缩进空格而不是单个制表符引起的

例如:

target:
    do stuff
会出错,但是

target:
<tab>do stuff
目标:
做事

不会。这是个问题。有些文本编辑器可能会用空格替换选项卡,请确保使用正确的文本编辑器,以免弄乱。在vi或任何其他基本编辑器中打开makefile,然后重写该makefile

请注意,在每个目标规则之后,必须在行首放置一个选项卡。该选项卡之后的所有内容都会传递到shell(可以有更多的选项卡、空格以及您想要的任何内容,但请记住,行的开头必须有一个选项卡)。

您可以尝试运行吗-

perl -pi -e 's/^  */\t/' Makefile

(当然,在保存备份后)

实际上我也遇到了类似的问题 一切都是对的,但后来我明白了 我用g-edit来告诉你答案 编辑>首选项>编辑器选项卡>取消选中按钮(插入空格而不是选项卡)
它工作得很好

您可能正在使用一个理解unicode标准的现代文本编辑器即使您在这些编辑器中打开一个ANSI文件,它们通常也会将其保存为UTF-8,这是非常向后兼容的,只是它会在文件开头放置两个“不可见”字节,以便其他程序知道文本的编码格式这就是第1行报告“错误”的原因

如果您使用的是Notepad for Windows,那么您很幸运,因为有一个选项可以覆盖此行为并以“ANSI”格式保存文件。以下是方法:

  • 文件->另存为
  • 将“另存为类型”更改为“所有文件”
  • 找到Makefile的确切位置(有时,“另存为”会将您放在不同的目录中,我不知道为什么会发生这种情况,但它一直发生在我身上)
  • 将文件名从“Makefile”更改为“Makefile”-尾随句点很重要(没有尾随句点,即使选择了“All Files”,尾随句点也将保存为“Makefile.txt”)
  • 将“编码”从“UTF-8”更改为“ANSI”


  • 我只是在用自动生成的gcc makefile编译源代码时遇到了同样的问题

    我最终发现这是由makefile开头的utf-8 BOM字符引起的。这些字符在一些文本编辑器中是不可见的


    因此,请尝试将文件保存为不带BOM的utf-8。

    这也可能是由于.PHONY和目标之间缺少冒号造成的

    .PHONY all 
    all:
    <tab><do this>
    
    。全部都是假的
    全部:
    
    抛出错误 而下面的工作很好

    .PHONY: all 
    all:
    <tab><do this>
    
    。假冒:全部
    全部:
    
    可能是Libs_defined.o之后的空格?行尾呢?Makefile通常对空格非常挑剔,tabsBetter会将文件压缩到某个地方。您使用的是前导空格而不是tab。它都是选项卡式的,这是错误的另一个原因吗?为什么它会显示在第1行?@JoãoMiranda有时,文本编辑器会插入空格,即使你按tab键。你真的确定这些是制表符吗?试着在你的系统上启动最简单的文本编辑器,看看字符是否真的是标签。我正在mac上使用股票文本编辑器,你推荐另一个吗?不允许只使用一个标签。规则是行中的第一个字符必须是制表符。在那之后,你可以在剩下的部分做任何你想做的事情(更多的标签,空格,等等)。不管有什么,都会传递给shell执行。@JoãoMiranda我不知道,从来没有在Mac上,但我相信还有其他的possibilities@MadScientist你说得对,我编辑了我的答案,让它更清晰一点。谢谢。我在使用时遇到了“缺少分隔符”错误。当您忘记在
    ifeq
    之间添加空格,使其看起来像
    ifeq(
    而不是
    ifeq)时,似乎会出现错误(
    .Hope make对此有点清楚!在重新运行make文件之前,您是否在编辑器中打开/保存了该文件?最佳答案-是的,在运行make之前,请避免在执行此perl命令后使用编辑器触摸该文件刚才运行上述命令修复了该问题,我使用的IDE是IntelliJ。谢谢