Makefile - 重新编译



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 文件` 标志,该标志将指定的文件标记为“旧的”。这意味着,文件本身不会被重新创建,并且不会因其而重新创建任何其他内容。您需要遵循以下步骤:

  • 使用 `make -o 头文件` 重新编译由于独立于特定头文件的原因而需要编译的源文件。如果涉及多个头文件,则为每个头文件使用单独的 `-o` 选项。

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

广告