1

我试图了解 makefile 是如何工作的。这是一个示例生成文件:

all: prog
x.o: x.cpp globals.hh
    $(CC) -c x.cpp
y.o: y.cpp globals.hh
    $(CC) -c y.cpp
prog: x.o y.o
    $(LD) -o prog x.o y.o -lc

如果我这样做make file,然后在 中进行一些更改x.cpp,然后重复make all哪些命令会重新运行?

据我了解,将重新运行以下命令:

$(CC) -c x.cpp

-o prog x.o y.o -lc

如果我改为更改头文件,我认为当我再次 make all 时所有三个都会重新运行。

我对么?顺序是什么?

另外,我正在尝试了解生成文件的依赖关系图的外观。我知道所有,xo、yo 和 prog 都是这里的目标。但是我的逻辑有意义吗? 在此处输入图像描述

4

1 回答 1

0

不会重新运行。

在创建x.oy.oprog时,它们中的每一个都将比它们各自的输入文件更新。

make不会重新制作比其输入更新的文件,因此不会重新运行任何命令。

POSIX 规范make

扩展描述

make 实用程序尝试执行所需的操作以确保指定的目标是最新的。如果一个目标存在并且比它的所有依赖项都更新,或者如果它已经被当前的 make 调用更新(不管目标的存在或年龄),它应该被认为是最新的。一个目标也可以被认为是最新的,如果它存在,与它的一个或多个先决条件相同,并且比其余的先决条件(如果有的话)更新。make 实用程序应将所有先决条件本身视为目标,并递归地确保它们是最新的,按照它们在规则中出现的顺序处理它们。make 实用程序应使用文件的修改时间来确定相应的目标是否已过期。

为确保目标是最新的,make 应确保目标的所有先决条件都是最新的,然后检查目标本身是否是最新的。如果目标不是最新的,则应通过执行规则的命令(如果有)使目标保持最新。如果在目标成功更新后目标不存在,则该目标应被视为比作为先决条件的任何目标更新。

如果目标存在并且既没有目标规则也没有目标的推理规则,则应认为该目标是最新的。如果尝试确保目标是最新的,但目标不存在并且既没有目标规则也没有目标的推理规则,这将是一个错误。

于 2020-05-02T15:30:20.370 回答