PRECOMPILED_HEADER и шаблон Subdirs на Qt - PullRequest
6 голосов
/ 13 ноября 2009

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

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

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

Привет

Ответы [ 5 ]

2 голосов
/ 26 октября 2012

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

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

1 голос
/ 27 марта 2013

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

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

PRECOMPILED_HEADER = ../includes.h

в одном проекте, который просто создает .pch, а затем "симулирует" 2-ую половину 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.
  • и т.д.
0 голосов
/ 20 июля 2015

Нет способа сделать это, если вы используете qmake.exe. Двоичный файл qmake имеет встроенные флаги, которые говорят CREATE (-Yc) pch для каждого проекта. Нет способа его вырезать.

0 голосов
/ 15 ноября 2009

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

0 голосов
/ 13 ноября 2009

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

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