我正在学习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(没有命令)输入时,执行此操作”吗?
感谢任何帮助。
感谢。
答案 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