Почему иногда обновляют предварительно скомпилированные заголовки, но не всегда? - PullRequest
0 голосов
/ 27 февраля 2020

ФАЙЛЫ

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, для этого ответа , но это дало ошибку.

1 Ответ

0 голосов
/ 28 февраля 2020

Чтобы частично ответить на мой собственный вопрос, в Makefile я изменил $^ на -o $@ $<, и это, кажется, все исправляет. Заголовочные файлы теперь обновляются каждый раз, а объединенные файлы имеют размер всего 144 КБ. У меня есть идея здесь .

...