当依赖文件未生成时为什么不检查时间戳?

当依赖文件未生成时为什么不检查时间戳?

我创建了一个丑陋的 Makefile,但它却出乎我的意料。当 main.o 未成功构建时,每次 make 时都会构建可执行文件。在我看来,在执行 main.o 目标命令后,make 会将 main.o 文件的时间戳与主文件进行比较。此时没有 main.o 文件,因此主文件应该是最新的。为什么会执行主目标的命令。在我的例子中,main 在第一次构建后始终存在,并且每次执行 make 时都会重建它,尽管内容相同。

当我通过shell添加一个比main更旧的main.o文件时,我更改了main.c文件,并使用make命令仅更新main1.o,而不更新main,这表明make比较了main和main.o的时间戳。

是不是我的理解有问题?是不是我对make的执行过程理解错了。

main: main.o
    gcc -o main1 main1.o
    echo generate

main.o: main.c
    gcc -c main.c -o main1.o

我的声誉不够,所以我在下面插入了一个图片链接

https://i.stack.imgur.com/VAX6j.png

答案1

我了解到您的 Makefile 存在问题

main: main.o
    gcc -o main1 main1.o
    echo generate

main.o: main.c
    gcc -c main.c -o main1.o

这个 Makefile 存在许多问题,大多数是由于main和之间的混淆造成的main1

当您输入时make,它将尝试创建目标main。 Main 依赖于main.o,因此make将尝试创建main.o。 Makefile 中有一个规则,因此make将使用该规则并执行

gcc -c main.c -o main1.o

请注意,这会创建main1.o而不是main.o。执行此规则后,仍然没有main.o

make并不关心这一点并将执行规则来创建main

gcc -o main1 main1.o

这将创建可执行文件main1mai这不是原始目标。但是,main1会在那里。

下次运行 时make,make 将执行相同的过程。它将尝试创建目标main,因为 main 不存在。main1存在,但这不是make要创建的目标。

main取决于main.o。没有main.o,所以make会尝试创建它。有一个main1.o,但main不依赖于 。正如我们所见,有一个 规则,main.o然后执行。

等等。

正确的版本应该是:

main: main.o
    gcc -o main main.o
    echo generate

main.o: main.c
    gcc -c main.c -o main.o

相关内容