我创建了一个丑陋的 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
我的声誉不够,所以我在下面插入了一个图片链接
答案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
这将创建可执行文件main1
,mai
这不是原始目标。但是,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