我的makefile对C有什么问题?

时间:2015-07-21 15:16:48

标签: c makefile

我正在学习C.我试图制作一个makefile,但由于某种原因,它不起作用。当我输入" make"在控制台中,以下警告将打印到控制台中:

makefile.c:1:1: warning: type specifier missing, defaults to 'int'
  [-Wimplicit-int]
CFLAGS=-Wall -g
^~~~~~
makefile.c:1:9: error: use of undeclared identifier 'Wall'
CFLAGS=-Wall -g
    ^
makefile.c:1:15: error: use of undeclared identifier 'g'
CFLAGS=-Wall -g
          ^
makefile.c:4:13: error: expected ';' after top level declarator
rm -f ex1

这是makefile的代码:

CFLAGS=-Wall -g

clean:
   rm -f ex1

代码应该编译ex1.c文件。为什么我的makefile不起作用?

5 个答案:

答案 0 :(得分:6)

Makefilesmake的指令,它们不是与c程序相同的程序。从错误消息中看起来您已将Makefile命名为c源代码文件,因此

  1. 将您的make文件重命名为Makefile

    mv makefile.c Makefile
    
  2. 您的makefile未指定要制作的内容 - 它只有clean标记,但不用担心,如果您的源代码位于单个文件中,则make可以它,只是;

    1. 指定您要制作的内容

      $ make ex1
      

      或者在Makefile中有一个条目来做同样的事情,比如

      CFLAGS=-Wall -g
      
      ex1: ex1.c   # This will tell make that ex1 is compiled from ex1.c
      
      clean:
          rm -f ex1
      

答案 1 :(得分:6)

当你运行make时,它会试图找出你想要它做什么。

默认情况下,它会查找名为Makefilemakefile的文件(对于GNU Make,它首先查找GNUMakefile)。如果它找到这样一个文件,它会认为它是一个makefile并读取它。

似乎这里make找到的内容看起来像有点像一个makefile,但后来猜测该如何处理它。在您的情况下,它会找到您认为是包含C代码的源文件的文件makefile.c,因此它使用其内置规则来处理C源文件并尝试使用C编译器进行编译。那失败了,因为你的makefile不是C程序! (你谎称命名为makefile.c

您可以通过运行make告诉make -f makefile.c明确地读取该文件(即使它具有非常规名称),或者您可以给它一个合理的名称(Makefilemakefile),以便在您运行make时自动找到它。

make处理makefile时,它找到的第一个目标是默认目标。在您的makefile中,第一个目标是clean,因此当make运行时,它将运行clean目标的规则。如果您希望它运行不同的目标,则将另一个目标放在makefile中,或者明确指定目标,例如make ex1(这将导致make查看文件ex1.c并使用其内置规则将C源文件编译为可执行文件。

答案 2 :(得分:0)

Makefile不是C文件。

你应该将它从makefile.c重命名为Makefile(mv ./makefile.c ./Makefile)

之后,在你的CFLAGS中,使用-W -ansi -Werror并且不要忘记在完成后删除-g,否则,你的程序执行速度会慢。

然后,因为它不是C文件,所以不要尝试用gcc编译它

输入

make 

或者您之前获得的任何其他规则,如

make re; make clean

如果您想编译整个内容,请清理垃圾文件(* .o并根据您的规则自动保存)。

答案 3 :(得分:-1)

Makefile没有扩展名。将makefile.c更改为makefile然后尝试。 假设您想要为file1.c创建makefile。 file2.c,这里file1.c依赖于file2.c create makefile,如下所示

makefile: file1.c file2.c  
gcc -o makefile file1.c file2.c

您可以使用命令

进行编译
make makefile

答案 4 :(得分:-1)

我通过执行以下操作解决了问题:

查看文件中的所有字符,特别是“干净”,即使您保存也不会改变颜色。

我认为你没有正确保存。

打开gedit并粘贴您的代码,然后按 ctrl + S 进行保存,然后将其命名为Makefile,而不是{{ 1}}。 Makefile是makefile类型。

保存时,单击文件属性检查文件Makefile.c。如果您看到Type:maketype为Ok或查看文件中的所有字符,则“clean”会将颜色从灰色更改为另一种颜色。

最后,在Makefile中,写下terminal,而不是make clean。它将像“learnCthehardcode”课程一样运行。