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

我在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 

此外,我猜它都是正确的标签。

这是一个标签问题。 某些文本编辑器可能会使用空格替换制表符,请确保使用不会弄乱它的正确文本编辑器。 在vi或任何其他基本编辑器中打开makefile,然后重写该makefile。

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

你可以尝试跑 –

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

(保存备份后当然)

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

例如:

 target: do stuff 

会错,但是

 target: do stuff 

将不会。

实际上我遇到了类似的问题,每件事情都是正确但后来我明白我用g-edit生病告诉解决方案编辑> preferances>编辑器选项卡>取消选中按钮(插入空格而不是制表符)它工作得很好

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

如果您正在使用Windows记事本,那么您很幸运,因为有一个选项可以覆盖此行为并以“ANSI”格式保存文件。 这是如何做:

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

    使用ANSI编码保存

在使用自动生成的gcc makefile编译源代码时,我遇到了同样的问题。

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

所以尝试将文件保存为utf-8而不使用BOM。