Предварительно скомпилированный заголовок не используется при включении стандартной библиотеки

Я пытаюсь создать предварительно скомпилированный заголовок и использовать его при компиляции файла cpp. У меня есть 2 следующих файла:
main.cpp:

#include "foo.hpp"

int main()
{
    myTemplate<int> obj;

    return 0;
}

и foo.hpp:

#ifndef FOO_HPP
#define FOO_HPP

template<class T>
class myTemplate
{
};

#endif

Я запускаю эту команду, чтобы создать файл gch

g++ -std=c++11 foo.hpp

Затем я создаю объектный файл, используя флаг -H, чтобы увидеть, какие файлы используются.

g++ -std=c++11 -H -c main.cpp

и выход

! foo.hpp.gch
 main.cpp

Хорошо. Используется файл gch.

Теперь я вставляю эту строку в начало main.cpp

#include <iostream>

Теперь, когда я пытаюсь создать объектный файл с помощью той же команды, что и раньше, я получаю длинный список файлов (конечно, большинство из них из стандартной библиотеки), но ни один из них не является foo.hpp.gch. Я вижу foo.hpp в списке.
Почему это имеет значение?
Как я могу использовать предварительно скомпилированный заголовок при создании объектного файла, когда заголовок включает стандартную библиотеку?


person Jona    schedule 23.09.2016    source источник


Ответы (1)


Как и просили, вот мой комментарий в качестве ответа:

Сначала включите предварительно скомпилированный заголовок, а затем стандартную библиотеку.

Такое поведение, вероятно, связано с тем, что компилятор не может знать, изменяется ли непредварительно скомпилированный заголовок (здесь стандартная библиотека), например. некоторые определения макросов, которые влияют на предварительно скомпилированный заголовок и делают его недействительным. (Может быть, кто-то сможет это проверить, так как это только предположение)

person Anedar    schedule 24.09.2016