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

在makefile中使用%.o:%.c,c,makefile,C,Makefile,我有一个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: coor

我有一个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
CC=gcc
CFLAGS=-std=c99-W-墙
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
o:coord3D.c coord3D.h double.h
双人。o:双人。c双人。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”并已编译。
-然后我们返回到包含“double.o”的“prog”,并重复这些步骤


这就是它的工作原理吗?如果是这样,我还有第二个问题:如果我们写“%.o:%.coord2D.h double.h”会怎么样?它是否只考虑规则“main.o”,因为它是唯一包含一个文件“.c”和两个“.h”文件的规则?

是的,这就是工作原理。至于你的第二个问题,没有-这两个规则都适用(但是如果没有静态模式规则和没有
.h
文件,Make将使用一个)。

你的问题主要在这里得到了回答-

请阅读它,它很短并且有例子,但是它的要点是:

一个文件可以是多个规则的目标。所有规则中提到的所有先决条件都合并到目标的一个先决条件列表中

因此,如果您有一个特定的目标,如“coord2D.o”,它将接受左侧匹配的所有规则,并合并所有右侧

请注意,在这种情况下,只有一个规则可以有一个配方(如案例中的
$(CC)
命令),其他所有规则都是空的,用于将依赖项声明拆分为几行

在您的例子中,您可以避免在附加规则中提到coord2D.c和其他c文件,因为
%.c
已经涵盖了它。您还可以将
double.h
公共依赖项移动到公共
%.o
规则以避免重复


还有一种生成头文件依赖关系规则的工具,尽管它很高级,而且有点复杂。

简单的答案是%.o是一个与任何以.o结尾的文件匹配的目标

“%.o:%.c”表示任何以.o结尾的文件都依赖于以.c结尾的相同文件名

以下以选项卡开头的行是生成%.o格式文件时要使用的规则。例如:

可执行文件“prog”需要构建“main.o”(第6行)。make查找用于生成main.o的规则-它找到两个:

  • 更具体的规则(按名称指定文件名):
  • 此规则指定main.o的所有依赖项。这样做的一个后果是,如果这些文件中有任何文件比main.o新(即在此期间已更改),那么main.o将被重新编译

  • 一般规则:

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

    阅读本文,您可能想了解“依赖项文件”如何动态创建它们,如何使用它们,etcHi,只是想知道..%自动考虑当前文件夹中的所有文件,或者我必须将其一并提交,我认为是这样。应该很容易尝试吗?也请查看此页面:
        main.o: main.c double.h coord2D.h coord3D.h
    
        %.o: %.c
                 $(CC) $(CFLAGS) $< -c
    
    gcc main.o double.o coord2D.o coord3D.o -lm -o prog