我有这个makefile:
CC = gcc
CFLAGS = -std=c99 -W -Wall
CFLAGSS = -std=c99 -W
LIBS = -lm
prog : main.o double.o coord2D.o coord3D.o
$(CC) $^ $(LIBS) -o $@
%.o : %.c
$(CC) $(CFLAGS) $< -c
coord2D.o: coord2D.c coord2D.h double.h
coord3D.o: coord3D.c coord3D.h double.h
double.o: double.c double.h
main.o: main.c double.h coord2D.h coord3D.h
我的问题:
“%.o:%.c”行做什么?
我在哪里:
我已经做了很多研究,但是我仍然不知道它是如何工作的。
据我了解,当我们键入“ make”时:
-我们转到第一个规则“ prog”,其中包含依赖项“ main.o”
-因此,我们转到由“%.o:%.c”识别的规则“ main.o”,因为它包含模式“ main.o:main.c”并已编译。
-然后返回“ prog”,其中包含“ double.o”,然后重复步骤
这是如何工作的?如果是这样,我还有第二个问题:如果我们写“%.o:%。c coord2D.h double.h”怎么办?是否会只考虑规则“ main.o”,因为它是唯一包含文件“ .c”和两个“ .h”文件的规则?
答案 0 :(得分:0)
是的,这就是pattern-specific variables的工作方式。关于第二个问题,否-两项规则都将适用(但是如果没有静态模式规则并且没有.h
文件,Make将使用implicit rule)。
答案 1 :(得分:0)
通常在这里回答您的问题-Multiple Rules for One Target。
请阅读它,它简短并且有示例,但是要点是:
一个文件可以成为多个规则的目标。所有规则中提到的所有先决条件都被合并到目标的先决条件列表中。
因此,如果您有一个特定的目标,例如“ coord2D.o”,它将采用左侧匹配的所有规则,并合并所有右侧。
请注意,在这种情况下,只有一个规则可以有一个配方(如您的情况下的$(CC)
命令),其他所有规则都是空的,并且仅用于将依赖项声明分成几行。
在您的情况下,您可以避免在其他规则中提及coord2D.c和其他C文件,因为%.c
已涵盖该文件。另外,您可以将double.h
的公共依存关系移到公共的%.o
规则以避免重复。
还有一种生成头文件依赖项规则described here的工具,尽管它先进且有点复杂。
答案 2 :(得分:0)
简单的答案是%.o是与任何以.o结尾的文件匹配的目标。
“%。o:%.c”表示任何以.o结尾的文件都依赖于以.c结尾的相同文件名。
以下行以制表符开头,是您生成%.o格式的文件时要使用的规则。因此,例如:
可执行文件“ prog”需要构建“ main.o”(第6行)。 make查找建立main.o的规则-它找到两个:
main.o: main.c double.h coord2D.h coord3D.h
此规则指定main.o的所有依赖项。这样的结果是,如果这些文件中的任何一个比main.o更新(即同时已更改),则将重新编译main.o
%.o: %.c
$(CC) $(CFLAGS) $< -c
这将运行命令“ gcc -std = c99 -W -Wall main.c -c “ $ <”是另一个通配符,表示“在此处包括目标行中的第一个必备文件名”-在这种情况下,为main.c
此处其他行中的其他通配符是“ $ @”(此处包含目标)和$ ^(此处包含必备组件的完整列表)。用于prog的命令将扩展为:
gcc main.o double.o coord2D.o coord3D.o -lm -o prog
这样的通配符规则使您可以使用很少的规则来构建复杂的项目。