📜  Makefile-重新编译

📅  最后修改于: 2020-11-01 04:38:16             🧑  作者: Mango


make程序是一个智能实用程序,可根据您在源文件中所做的更改来工作。如果您有四个文件main.cpp,hello.cpp,factorial.cpp和functions.h,则其余所有文件都依赖于functions.h,而main.cpp既依赖于hello.cpp,又依赖于factorial.cpp。因此,如果您对functions.h进行了任何更改,那么make将重新编译所有源文件以生成新的目标文件。但是,如果对main.cpp进行任何更改,因为它不依赖于任何其他文件,则仅重新编译main.cpp文件,而不会重新编译help.cpp和factorial.cpp。

在编译文件时, make检查其目标文件并比较时间戳。如果源文件的时间戳比目标文件新,则假定源文件已更改,它将生成新的目标文件。

避免重新编译

可能有一个包含数千个文件的项目。有时您可能已更改了源文件,但可能不想重新编译依赖于该文件的所有文件。例如,假设您将宏或声明添加到其他文件所依赖的头文件中。保守一点, make假设头文件中的任何更改都需要重新编译所有从属文件,但是您知道它们不需要重新编译,因此您不希望浪费时间等待它们进行编译。

如果在更改头文件之前就预料到了问题,可以使用-t标志。该标志告诉make不要运行规则中的命令,而是通过更改目标的上次修改日期来标记目标为最新。您需要按照以下步骤操作-

  • 使用命令“ make”重新编译确实需要重新编译的源文件。

  • 在头文件中进行更改。

  • 使用命令“ make -t”将所有目标文件标记为最新。下次运行make时,头文件中的更改不会引起任何重新编译。

如果您在某些文件确实需要重新编译的时候已经更改了头文件,则现在为时已晚。相反,您可以使用`-o file’标志,该标志将指定的文件标记为“旧”。这意味着,文件本身将不会被重造,并且不会对其帐户进行任何其他重造。您需要按照以下步骤操作-

  • 使用`make -o header file’重新编译出于某种原因而需要编译的源文件。如果涉及多个头文件,则对每个头文件使用单独的`-o’选项。

  • 用`make -t’更新所有目标文件。