我的makefile对C有什么问题?

The*_*mes -1 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
Run Code Online (Sandbox Code Playgroud)

这是makefile的代码:

CFLAGS=-Wall -g

clean:
   rm -f ex1
Run Code Online (Sandbox Code Playgroud)

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

Sor*_*ren 6

Makefiles是指令make,它们不是与c程序相同的程序.从错误消息中可以看出,您已将自己命名Makefile为c源代码文件,因此

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

    mv makefile.c Makefile
    
    Run Code Online (Sandbox Code Playgroud)

makefile没有指定要做什么 - 它只有一个clean标签,但不要担心,如果你的源代码在一个文件中,那么make就可以解决它,只是;

  1. 指定您要制作的内容

    $ make ex1
    
    Run Code Online (Sandbox Code Playgroud)

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

    CFLAGS=-Wall -g
    
    ex1: ex1.c   # This will tell make that ex1 is compiled from ex1.c
    
    clean:
        rm -f ex1
    
    Run Code Online (Sandbox Code Playgroud)


Jon*_*ely 6

当你运行make它时试图弄清楚你想要它做什么.

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

看来这里make找到的东西看起来有点像 makefile,但后来猜测该如何处理它.在您的情况下,它会发现您makefile.c假定的文件是包含C代码的源文件,因此它使用其内置规则来处理C源文件并尝试使用C编译器进行编译.那失败了,因为你的makefile不是C程序!(你通过命名而撒谎makefile.c)

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

make处理一个makefile它找到的第一个目标是缺省目标.在你的makefile中,第一个目标就是clean当make运行时,它将运行clean目标的规则.如果你想让它运行一个不同的目标,那么要先将另一个目标放在makefile中,或者明确指定一个目标,例如make ex1(这将导致make查看该文件ex1.c并使用其内置规则将C源文件编译成可执行文件) ).