Makefile:没有规则的依赖项不会使父项无效

时间:2017-04-25 01:24:55

标签: c++ c makefile header-files makefile-errors

这是我的Makefile的简化版本:

all: myprogram

myprogram: main.o
    c++ main.o -o myprogram

main.o: main.cpp mylib.hpp
    c++ -c main.cpp 

mylib.hpp: mylib.inl

上面提到的所有这些文件都是真实文件。当我更改mylib.hpp时,main.cpp会重新编译。但是,我的问题是当我更改mylib.inl时,main.cpp执行而不是重新编译。如何在编辑main.o时使myprogram目标失效,从而使mylib.inl目标无效?我希望使用.PHONY目标,因为我不想每次都重新编译所有内容,只有在我编辑mylib.inl时才会这样做。

1 个答案:

答案 0 :(得分:4)

您的问题是makefile中描述的依赖项:

mylib.hpp: mylib.inl

没有描述真正的依赖。更改mylib.inl不会更改mylib.hpp(没有规则可以触发此类更改)。

如果mylib.inl中包含mylib.hpp,那么它实际上应该是main.o而不是mylib.hpp的依赖,从而导致这样的依赖:

main.o: main.cpp mylib.hpp mylib.inl

手动维护单个依赖项可能容易出错,这就是为什么大多数编译器都提供可以自动创建可以从make文件中包含的依赖项文件的函数。然后,您可以为编译提供更多通用规则。有关如何使用此功能的更多详细信息,请查看this article