我有这个 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
Run Code Online (Sandbox Code Playgroud)
我的问题:
“%.o:%.c”行有什么作用?
我在哪里:
我做了很多研究,但我仍然不知道它到底是如何工作的。
据我所知,当我们输入“make”时:
- 我们转到包含依赖项“main.o”的第一条规则“prog”
- 因此,我们转到规则“main.o”,它是被“%.o : %.c”识别,因为它包含模式“main.o : main.c”并进行编译。
- 然后我们回到“prog”,其中包含“double.o”,然后重复这些步骤
是这样的吗?如果是这样,我还有第二个问题:如果我们写“%.o : %.c coord2D.h double.h”怎么办?它是否只考虑规则“main.o”,因为它是唯一包含文件“.c”和两个“.h”文件的规则?
简单的答案是 %.o 是匹配任何以 .o 结尾的文件的目标。
“%.o: %.c”表示任何以 .o 结尾的文件都依赖于以 .c 结尾的相同文件名的存在。
以下以制表符开头的行是生成 %.o 形式的文件时要使用的规则。因此,例如:
可执行文件“prog”需要构建“main.o”(第 6 行)。make 寻找构建 main.o 的规则 - 它找到两个:
main.o: main.c double.h coord2D.h coord3D.h
Run Code Online (Sandbox Code Playgroud)
该规则指定了 main.o 的所有依赖项。这样做的一个后果是,如果这些文件中的任何一个比 main.o 新(即同时已更改),则 main.o 将被重新编译
%.o: %.c
$(CC) $(CFLAGS) $< -c
Run Code Online (Sandbox Code Playgroud)
这将运行命令“gcc -std=c99 -W -Wall main.c -c “$<”是另一个通配符,它意味着“在此处包含目标行中的第一个必备文件名” - 在本例中为 main。 C
此处其他行中的其他通配符是“$@”(此处包括目标)和 $^(此处包括先决条件的完整列表)。prog 的命令将扩展为:
gcc main.o double.o coord2D.o coord3D.o -lm -o prog
Run Code Online (Sandbox Code Playgroud)
像这样的通配符规则允许您用很少的规则构建复杂的项目。
| 归档时间: |
|
| 查看次数: |
25535 次 |
| 最近记录: |