当你编写一个 makefile 时,你通常从头开始,然后朝着开始的方向努力。您从最终产品开始,并给出有关如何从起点开始生产的规则。
在这种情况下,您似乎有两个最终产品:A
和C
.
all: A C
如果您没有在命令行上指定目标,make 将构建它在 makefile 中看到的第一个目标。因此,您希望它作为文件中的第一个目标,其他目标在其下方。如果你把它想象成一棵树,这就是树的根,下面的每一项都是那棵树的一个分支。
也可以定义不包含在此根之下的次要目标。例如,许多(大多数?)makefile 包含一个名为的目标,该目标clean
删除将在构建过程中创建的所有中间文件。这只会在/如果用户调用时使用make clean
,而不是作为make
命令发出的一部分。
无论如何,然后你告诉它每个依赖什么,以及如何从它依赖的内容创建它:
A: A.o B.o
$(CC) -o A A.o B.o
C: B.o C.o
$(CC) -o B B.o C.o
然后(如果有必要——它不在这里)你会告诉它每个.o
文件如何依赖于一个.c
文件。然而, Gmake(就像几乎make
所有存在的工具一样)具有内置规则来告诉它如何编译 C 或 C++ 文件以生成匹配的目标文件。这些就像你的makefile在顶部包含这样的东西:
CC = gcc
.c.o:
$(CC) $(CFLAGS) -c $*.c
这会将 CFLAGS 的当前值作为标志传递给编译器,因此您希望将其设置为您需要的标志 - 在您的情况下:
CFLAGS = -std=c89
您通常希望将其放在 makefile 的顶部,通常位于任何目标之前。
我应该补充一点,这甚至无法涵盖您可以在 makefile 中执行的所有操作。当您处理大量文件时,有很多快捷方式非常方便,但当您只有三个源文件时,它们就不是很有用了。