Существуют ли кроссплатформенные предварительно скомпилированные структуры / методы заголовков в C ++? - PullRequest
1 голос
/ 19 февраля 2009

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

Какой опыт вы пытались сделать это?

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

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

Ответы [ 3 ]

3 голосов
/ 20 февраля 2009

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

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

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

0 голосов
/ 19 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...