Существуют ли кроссплатформенные фреймворки / методы предварительно скомпилированных заголовков в C ++?

Мне интересно, что другие испытали на реализации кроссплатформенных (Linux и Windows) предварительно скомпилированных заголовков на C ++. Я думаю о том, что Visual Studio позволяет вам делать с файлами stdafx.h, которые могут значительно сократить время компиляции для больших объемов кода C ++ за счет предварительной компиляции общих заголовков, используемых повсеместно (заголовки std / boost / etc). Есть ли способ сделать это кроссплатформенным с какой-то структурой или чем-то еще?

Какой опыт у вас был, пытаясь сделать это?

Редактировать

На самом деле я не имею в виду совместное использование фактического результирующего pch, меня больше интересуют фреймворки, которые могут генерировать pch и что бы ни было эквивалентно, скажем, gcc, при компиляции на этой конкретной платформе.


person Doug T.    schedule 19.02.2009    source источник


Ответы (3)


gcc автоматически прекомпилирует заголовки, если вы передадите файл заголовка вместо файла реализации. Просто добавьте переключатель -x, если он пытается создать объектный код. GCC всегда будет искать файл .gch перед заголовком, поэтому его достаточно просто использовать. На этой странице есть дополнительная информация. Добавьте его в свой Makefile, чтобы автоматизировать процесс.

person greyfade    schedule 19.02.2009

Предварительно скомпилированные заголовки 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 генерировать проекты Visual Studio с предварительно скомпилированными заголовками, я еще не пробовал его для их создания Makefile, но это не должно быть проблемой.

В Visual Studio есть и другие приемы для повышения скорости компиляции. Один из них - это компиляция множества cpp-файлов с одинаковыми настройками за один пакет. Это можно сделать вручную, используя то, что обычно называют системой сборки единства, где вы включаете несколько cpp-файлов в один файл и собираете его за один раз, сохраняя при этом синтаксический анализ заголовка и диск io.

person Laserallan    schedule 19.02.2009
comment
Понимал, что после публикации этого ответа я был немного не по теме, но я все равно сохраняю его, кому-то это может быть полезно :) - person Laserallan; 19.02.2009

Если вы имеете в виду перенос предварительно скомпилированной базы данных заголовков (.pch или что-то еще) между платформами, то это невозможно, поскольку заголовки будут иметь разное содержимое на разных платформах.

person Community    schedule 19.02.2009