为什么make有时更新预编译头,但不总是



文件

foo.hpp

#include <iostream>
class foo
{
public:
foo(int = 1);
int get_x() const { return x; }
private:
int x;
};

foo.cpp

#include "foo.hpp"
foo::foo(int xp)
{
x = xp;
}

main.cpp

#include "foo.hpp"
int main()
{
foo bar;
std::cout << bar.get_x() << std::endl;
}

Makefile(对于这样一个简单的例子来说,这太过分了,但我想使用这样的东西(

SHELL = /bin/bash
CC = g++
CPPFLAGS = -MMD -MP
SRC = $(wildcard *.cpp)
OBJ = $(SRC:.cpp=.o)
EXECUTABLE = main
all: $(SRC) $(EXECUTABLE)
$(EXECUTABLE): $(OBJ)
$(CC) $(OBJ) -o $@
.cpp.o:
$(CC) $(CPPFLAGS) -c $^
-include $(SRC:.cpp=.d)

观察到的行为
文件为20K。运行make,输出为1,文件为48K。现在将头文件中的默认参数int = 1更改为int = 2
make:输出为2,文件为11M。几乎所有这些都在foo.hpp.gch中。将int = 2更改为int = 3
make:输出仍然是2,foo.hpp.gch没有更新。

现在,如果我将#include <iostream>从foo.hpp移到main.cpp中:
文件是20K。运行make,输出为1,文件为48K。将int = 1更改为int = 2
make:输出为2,文件为1.9M,几乎是foo.hpp.gch中的全部。将int = 2更改为int = 3
make:输出为3,foo.hpp.gch进行了更新。

问题
为什么make在一种情况下更新预编译头(.gch(,而在另一种情况中不更新?为什么文件大小如此不同?iostream的内容发生了什么变化?如何强制make始终考虑头文件中的更改?根据这个答案,我尝试将-fsyntax-only添加到CPPFLAGS中,但出现了错误。

为了部分回答我自己的问题,在Makefile中,我将$^更改为-o $@ $<,这似乎解决了所有问题。头文件现在每次都会更新,合并后的文件只有144K。我在这里得到了这个想法。

最新更新