пятница, 23 марта 2012 г.

Precompiled Headers в Qt

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

Кроме повышения производительности, подключение Precompiled Headers позволяет не писать инклуды Qt классов в коде.
Что для этого нужно.
1) Все инклуды Qt клаcов выносятся в отдельный файл.
2) Редактируется файл проекта.
3) В коде больше не нужно включать Qt классы.



Пример файла инклудов:
/* Add C includes here */

#if defined __cplusplus
/* Add C++ includes here */

#ifdef QT_CORE_LIB
# include <qtcore>
#endif

#ifdef QT_GUI_LIB
# include <qtgui>
#endif

#ifdef QT_NETWORK_LIB
# include <qtnetwork>
#endif

#ifdef QT_XML_LIB
# include <qtxml>
#endif

#ifdef QT_SQL_LIB
# include <qtsql>
#endif

#endif


Изменения в проекте:
CONFIG += precompile_header
# Use Precompiled headers (PCH)
PRECOMPILED_HEADER = qtincludes.h
HEADERS += qtincludes.h


Всё. Можно очищать код от всех Qt инклудов.

1 комментарий:

  1. Интересное решение. Как всегда есть несколько маленьких "но".

    К сожалению, QtCreator перестаёт выдавать подсказки для модулей, определённых таким образом (например, QTcpSocket). Мелочь, а к хорошему быстро привыкаешь.

    И совсем маленькая ремарка. На Qt5 (не знаю как это было в 4-ке) наименование этих классов начинается с заглавных букв (например, QtSql, а не qtsql).

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

    ОтветитьУдалить