gpt4 book ai didi

c - 在 makefile 中使用 %.o : %. c

转载 作者:行者123 更新时间:2023-11-30 16:21:27 25 4
gpt4 key购买 nike

我有这个 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”
- 因此,我们转到规则“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 的规则 - 它找到两个:

  1. 更具体的规则(按名称指定文件名):
    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

    像这样的通配符规则允许您用很少的规则构建复杂的项目。

    关于c - 在 makefile 中使用 %.o : %. c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54854128/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com