ФАЙЛЫ
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 и файлы 48К. Теперь измените аргумент по умолчанию int = 1
в заголовочном файле на int = 2
.
make
: вывод равен 2, а файлы 11M. Почти все это находится в foo.hpp.gch. Измените int = 2
на int = 3
.
make
: вывод по-прежнему равен 2, foo.hpp.gch не обновлялся.
Теперь, если я переместу #include <iostream>
из foo.hpp в главное. cpp:
Файлы размером 20 КБ. Запустите make
, вывод равен 1, а файлы 48 КБ. Измените int = 1
на int = 2
.
make
: вывод равен 2, а файлы - 1,9 МБ, почти все это в файле foo.hpp.gch. Измените int = 2
на int = 3
.
make
: вывод равен 3, foo.hpp.gch сделал обновление.
ВОПРОСЫ
Почему make
обновляет предварительно скомпилированный заголовок (.gch) в одном случае, а не в другом? Почему размеры файлов такие разные? Что случилось с содержанием iostream
? И как я могу заставить make
всегда учитывать изменения в заголовочных файлах? Я попытался добавить -fsyntax-only
к CPPFLAGS
, для этого ответа , но это дало ошибку.