Makefile all命令

时间:2015-09-27 22:50:29

标签: makefile

我正在学习c,并试图了解makefile。我正在努力学习C语言。

在练习2中,额外的学分表示在我的makefile中创建一个命令,允许我通过输入“make”来编译我的.c文件。

我的makefile是:

CLAGS=-WALL -g

all: ex1

clean:
    rm ex1

这样做 - 即输入make clean删除ex1文件,然后输入make compiles ex1.c到可执行文件中。

但是,我很困惑为什么在clean命令中,rm ex1必须在clean下面的行上缩进,但对于all命令,如果我在下面的行上缩进ex1,则会抛出错误。这是为什么?

我的另一个问题是 - 这究竟是如何运作的?所有这些都只是一个关键词,即“当make(没有命令)输入时,执行此操作”吗?

感谢任何帮助。

感谢。

2 个答案:

答案 0 :(得分:2)

此:

clean:
    rm ex1

规则。此规则包含一个命令rm ex1。该命令是一个shell命令。规则中的每个命令都必须使用TAB字符缩进(或Make会混淆)。

此:

all: ex1

是没有命令的规则。这里的“ex1”不是命令,而是先决条件

此:

all:
    ex1

是无效规则,因为它包含无效命令; “ex1”不是有效的shell命令。 (如果你不相信我,可以在命令行上试试。)

如果执行Make而不指定目标(通过键入“make”),Make将使用默认目标,该目标通常是makefile中的第一个目标。 (有些例外你现在不用担心。)按照惯例,“所有”是执行大部分工作的规则的名称,它通常是默认目标;这是一个惯例,而不是内置于Make。

答案 1 :(得分:0)

由于ex1是默认为cc文件调用ex1.c的目标,因此您可以all:成为这样的目标

all:
    $(CC) -o $(EXECUTABLE) $(CFLAGS) $(LDFLAGS) ex1.c

请勿复制并粘贴此内容,因为我已使用空格而Makefiles需要标签。

更好的方法是创建一个目标文件目标,并在另一个目标链接时仅编译已更改的文件,如下所示

CC      = gcc
CFLAGS  = -Wall -Wextra -Werror
LDFLAGS = # empty if you are not going to link to any library
OBJ     = ex1.o
PROGRAM = ex1

all: $(OBJ)
    $(CC) $(CFLAGS) $(LDFLAGS) -o $(PROGRAM) $(OBJ)

%.o: %.c
    $(CC) $(CFLAGS) -c $<

clean:
    rm -fv *.o $(PROGRAM)

现在您可以轻松添加更多.c个文件,只需将它们附加到OBJ宏,就像这样

OBJ = ex1.o ex2.o ... exn.o