我知道我可以随时中断make进程而无需再次重新编译整个源代码树.据我所知,如果目标尚未编译,则仅编译目标,或者在最后一次编译后修改源代码.
但是,如果我中断make,肯定会有一个或多个(取决于并发级别)半就绪二进制文件.下次我运行make时它对它们有什么作用?或者,当我按下Ctrl C以避免部分编译的二进制文件时,它是否完成当前目标?
解决方法:
简单来说,您可以将make视为具有(可能很大)步数,其中每个步骤将许多文件作为输入并创建一个文件作为输出.
步骤可能是“将file.c编译为file.o”或“使用ld将main.o和file.o链接到程序”.如果使用CtrlC中断make,则将终止当前正在执行的步骤,该步骤将(或应该)删除它正在处理的输出文件.通常没有留下任何“半准备好的二进制文件”.
重新启动make时,它将查看所有输入和输出文件的时间戳,并重新运行以下步骤:
>输入文件的时间戳比输出文件的时间戳更新
>输出文件不存在
这通常意味着如果一个步骤需要很长时间才能运行(这在现代计算机上很少见,但是大型程序的ld步骤在设计make时很容易花费很多分钟),那么停止并重新启动make将从该步骤开始开始.
普通Makefile的实际情况要比上面的描述复杂得多,但基本原理是相同的.