Эффективное совместное использование предварительно скомпилированных заголовков

У меня есть фреймворк, который используется в нескольких проектах (включая несколько примеров, показывающих, как работает фреймворк). Фреймворк имеет такие компоненты, как ядро, графика, физика, графический интерфейс и т. Д. Каждый из них представляет собой отдельную библиотеку. Также есть несколько конфигураций.

Основной файл решения компилирует полный проект со всеми возможными конфигурациями, чтобы проекты могли использовать библиотеки. Поскольку фреймворк редко перекомпилируется, особенно кем-то (включая меня), работающим над проектом, который использует фреймворк, имеет смысл предварительно скомпилировать множество заголовков.

Изначально у меня был свой собственный предварительно скомпилированный заголовок для каждого проекта / образца, который использовался для всего проекта. Каждый раз мне приходилось перестраивать один и тот же pch (например, Debug), поэтому я решил, что общий PCH уменьшит избыточную компиляцию PCH. Все идет нормально. У меня есть проект, который компилирует PCH вместе с библиотеками. Все последующие проекты / образцы теперь используют тот же PCH. Это прекрасно сработало.

Единственная проблема в том, что я заметил увеличение размера файла. Это не препятствие: если проект, использующий эту структуру, планируется выпустить, он может отделиться от общего PCH и создать свой собственный. Я сделал это ради быстрой разработки (я фактически создал инструмент, который создает файлы проекта VS и исходные файлы для нового проекта / образца, готового к сборке, а также упрощает обновление предыдущего проекта, в котором использовался более старый версия фреймворка).

В любом случае (я предполагаю, что) увеличение размера файла связано с тем, что независимый файл проекта VS, который создает общий PCH, включает все заголовки из всех библиотек. У меня вопрос, могу ли я использовать условную компиляцию (#ifndef) для уменьшения размера конечного исполняемого файла? Или, может быть, как-то поделиться несколькими файлами PCH (насколько я знаю, это невозможно, но я, возможно, ошибаюсь) Если я не понимаю, пожалуйста, скажите об этом (добрыми словами :)), поскольку мои знания о файлах PCH очень ограничены .

Спасибо!

Примечание. Чтобы повторить и прояснить ситуацию, у меня есть один файл решения, в котором компилируются все библиотеки, включая общий PCH. Теперь, если я перекомпилирую все образцы и проекты, они будут компилироваться максимум за пару секунд или больше. Раньше каждый проект воссоздавал файл PCH. Кроме того, изначально я хотел иметь PCH для каждой библиотеки, но затем я обнаружил, что исходный файл не может использовать несколько файлов PCH, поэтому этот вариант был невозможен. Другой вариант - скомпилировать все возможные комбинации файлов PCH, но это слишком трудоемко, громоздко и подвержено ошибкам.


person Samaursa    schedule 08.11.2010    source источник
comment
ПОЖАЛУЙСТА, ГОЛОСОВАТЬ ЗА ЭТО: visualstudio.uservoice.com/forums/121579-visual-studio/   -  person Scott Langham    schedule 08.11.2013


Ответы (2)


Похоже, проблема с размером возникает из-за использования заголовков, которые вам на самом деле не нужны, но все же имеет смысл использовать эти заголовки при разработке из-за более быстрого изменения.

При использовании #ifndefs: предварительная компиляция является грубой. Вы теряете возможность совместно использовать предварительную компиляцию в том месте, где есть разница. Если вы используете #ifndefs для создания разных вариантов того, что вы включаете, т. Е. если у вас есть

#ifndef FOO

Затем предварительно скомпилированный заголовок должен остановиться до того момента, когда FOO по-разному определен в двух файлах, которые используют этот предварительно скомпилированный заголовок. Так что #ifndef не решит проблему. В конечном итоге FOO должен быть одинаковым, иначе вы вернетесь к отдельным pch-файлам для разных проектов. Ни то, ни другое ничего не решает.

Что касается совместного использования нескольких файлов .pch: фундаментальное ограничение файлов .pch заключается в том, что каждый .obj может использовать только один. Конечно, файлы .pch могут иметь произвольные комбинации заголовков. У вас может быть .pch для ядра + графики, .pch для ядра + физики, ядра + AI и т.д. время. Мне это не кажется реалистичным. Такая схема и ее варианты звучат как большая работа по реструктуризации без реальной выгоды. Вы же не хотите создавать бесчисленное количество комбинаций и отслеживать их все. Это возможно, но это не сэкономит ваше время.

На мой взгляд, вы поступаете совершенно правильно, жертвуя размером исполняемого файла для быстрого перехода во время разработки / отладки, а затем имея более медленный, но более компактный способ сборки для фактического выпуска.

person James Crook    schedule 07.12.2010

В прошлом я обнаружил, что вы довольно быстро сталкиваетесь с уменьшением отдачи по мере того, как вы добавляете больше в предварительно скомпилированные заголовки, поэтому, если вы пытаетесь вложить больше, чтобы сделать его более полезным в большем количестве проектов, он попадет в указывают на то, что он замедляется. В наших проектах для компиляции файлов PCH требуется больше времени, чем для большинства исходных файлов, но все же максимум несколько секунд. Я бы посоветовал сделать файлы PCH специфичными для каждого используемого вами проекта. Вы правы, говоря, что исходный файл может относиться только к одному файлу PCH, но один из способов обойти это - использовать опцию 'force include' (я думаю, на вкладке Advanced), чтобы гарантировать, что все файлы включают PCH файл для этого проекта.

person the_mandrill    schedule 08.11.2010