Шаблон PRECOMPILED_HEADER и Subdirs в Qt

У меня есть большой проект Qt, разделенный на несколько статических библиотек (около 70) и одно приложение, и для этого я использую файл .pro с шаблоном subdirs.

Чтобы ускорить время компиляции, я хочу использовать предварительно скомпилированные заголовки и обнаружил, что использование PRECOMPILED_HEADER в каждом подпроекте помогает, НО каждый проект компилирует предварительно скомпилированный заголовок отдельно (и это самый медленный шаг).

Есть ли способ «поделиться» предварительно скомпилированным заголовком между всеми подпроектами, включенными в шаблон подкаталогов? Таким образом, предварительно скомпилированный заголовок может быть создан один раз и использоваться всеми подпроектами?

С Уважением


person Federico    schedule 13.11.2009    source источник
comment
Если вы решили это, мне будет интересен ответ   -  person Tim Meyer    schedule 15.05.2012
comment
К сожалению, я так и не нашел способ сделать это   -  person Federico    schedule 15.11.2013


Ответы (5)


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

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

person artm    schedule 26.10.2012
comment
В случае довольно одинаковых флагов компилятора/препроцессора для разных подпроектов, как бы вы этого добились? один подпроект генерирует pch, а другой использует его? Если да, то как просто использовать pch для других подпроектов? Благодарность :) - person AlGrenadine; 30.06.2021

Официального пути к сожалению нет. Вы можете использовать некоторые хаки, чтобы хотя бы получить базовую поддержку PCH.

я использовал

PRECOMPILED_HEADER = ../includes.h

в одном проекте, который просто создает .pch, а затем «симулирует» вторую половину PRECOMPILED_HEADER в каком-то общем файле .pri для реальных проектов. Например. с VS вы бы использовали что-то вроде:

QMAKE_CXXFLAGS += /FIincludes.h /Yuincludes.h /Fppath/to/1stproj/intdir/projname_pch.pch
#QMAKE_CXXFLAGS += /wd4651
QMAKE_LFLAGS += path/to/1stproj/intdir/projname_pch.obj

Вы можете столкнуться с различными проблемами, например.

  • если флаги компилятора слишком сильно различаются (см. wd4651 выше).
  • Он также не работает ootb с файлами pdb. Вместо этого используйте /Z7.
  • С gcc вы можете столкнуться с несовместимыми опциями -fPIC.
  • и т.п.
person Trass3r    schedule 27.03.2013
comment
Спасибо за эту хорошую идею, возможно ли сделать это для других компиляторов, таких как mingw/xcode? - person AlGrenadine; 30.06.2021

Если бы каждый заголовок компилировался отдельно в свой pch, то это могло бы работать. К сожалению, насколько мне известно, в проектах C++ существует только одна единица трансляции для предварительно скомпилированных заголовков, которую можно использовать глобально для каждого проекта. Ну, вы можете использовать один глобальный файл для всех своих проектов, но это менее эффективно: это может привести к увеличению времени сборки, потому что каждый раз, когда предварительно скомпилированный заголовок изменяется, ВСЕ должно быть перестроено.

person fmuecke    schedule 13.11.2009
comment
Идея состоит в том, что предварительно скомпилированный заголовок не изменится, я хочу поместить туда все специфические вещи Qt и ничего больше. Но есть ли способ с Qmake сделать этот глобальный файл? - person Federico; 13.11.2009

Просто предложение - вы можете попробовать использовать cmake. У него есть поддержка как qt, так и pch, и текущая поддержка pch страдает от той же проблемы. Макросы, связанные с pch, находятся в отдельном простом для понимания файле и могут быть переписаны, чтобы сделать один большой файл pch для множества подпапок. Вот как я намерен решить ту же проблему для своего проекта qt.

person IggShaman    schedule 15.11.2009

Это невозможно сделать, если вы используете qmake.exe. В двоичный файл qmake встроены флаги, говорящие СОЗДАТЬ (-Yc) pch для каждого проекта. Нет возможности его вырезать.

person metizik    schedule 20.07.2015