Предварительно скомпилированные заголовки Visual Studio основаны на заголовочном файле, включающем все, что должно быть предварительно скомпилировано, как правило, обычно включают редко измененные заголовочные файлы, такие как стандартная библиотека. Он подключен к stdafx.cpp, для которого в настройках задано «генерировать предварительно скомпилированный заголовок», он включает только stdafx.h.
Затем Visual Studio принудительно заставляет все файлы включать stdafx.h в качестве первого определения препроцессора, чтобы избежать проблем с заголовками, включенными перед ним или измененными макросами #define, которые влияют на синтаксический анализ stdafx.h.
Я думаю, что самый простой способ отобразить это поведение на g ++ - сделать так, чтобы он предварительно компилировался только в stdafx.h и обычно включал другие заголовки. Это будет похоже на то, что вы делаете в Visual C ++. Вы также можете переименовать stdafx во что-то менее глупое, например «precompiled_.h» или что-то в этом роде. Настроить Visual Studio для использования этого файла легко.
Я реализовал такую систему с использованием make-файлов для g ++, и она дала некоторую производительность, но мне не удалось получить такой же прирост производительности, какой я получаю от предварительно скомпилированных заголовков в visual studio. Это было некоторое время назад, и с тех пор g ++ мог улучшиться. Мне удалось заставить CMake генерировать визуальные студийные проекты с предварительно скомпилированными заголовками, я еще не пробовал их для создания Makefile, но это не должно быть проблемой.
В Visual Studio есть и другие приемы, улучшающие скорость компиляции. Один компилирует много cpp-файлов с одинаковыми настройками в одном пакете. Это можно сделать вручную, используя так называемую систему единой сборки, где вы объединяете несколько cpp-файлов в один файл и собираете его за один раз, сохраняя разбор заголовка и диск io.