Главная · Все классы · Основные классы · Классы по группам · Модули · Функции

[Предыдущая: Продвинутое использование qmake] [Содержание] [Следующая: Справочник по qmake]

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

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

qmake поддерживает использование предварительно скомпилированных заголовков (precompiled headers, PCH) на некоторых платформах и средах сборки, включающих:

Добавление предварительно скомпилированных заголовков в ваш проект

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

Предварительно скомпилированный заголовок должен содержать код, который является стабильным и статичным во всем вашем проекте. Типичный PCH может выглядеть так:

Пример: stable.h

 // Add C includes here

 #if defined __cplusplus
 // Add C++ includes here
 #include <stdlib>
 #include <iostream>
 #include <vector>
 #include <QApplication> // Qt includes
 #include <QPushButton>
 #include <QLabel>
 #include "thirdparty/include/libmain.h"
 #include "my_stable_class.h"
 ...
 #endif

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

Опции проекта

Чтобы ваш проект начал использовать PCH вам нужно только определить в вашем файле проекта переменную PRECOMPILED_HEADER:

     PRECOMPILED_HEADER = stable.h

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

Все платформы, поддерживающие предварительно скомпилированные заголовки, имеют установленную опцию конфигурации precompile_header. Используя эту опцию, вы можете инициировать условные блоки в вашем файле проекта для добавления настроек при использовании PCH. Например:

     precompile_header:!isEmpty(PRECOMPILED_HEADER) {
     DEFINES += USING_PCH
     }

Примечания по возможным решениям

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

     PRECOMPILED_HEADER = window.h
     SOURCES            = window.cpp

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

Пример проекта

Вы можете найти следующий исходный код в каталоге examples/qmake/precompile поставки Qt:

mydialog.ui

 <ui version="4.0" >
  <author></author>
  <comment></comment>
  <exportmacro></exportmacro>
  <class>MyDialog</class>
  <widget class="QDialog" name="MyDialog" >
   <property name="geometry" >
    <rect>
     <x>0</x>
     <y>0</y>
     <width>401</width>
     <height>70</height>
    </rect>
   </property>
   <property name="windowTitle" >
    <string>Mach 2!</string>
   </property>
   <layout class="QVBoxLayout" >
    <property name="margin" >
     <number>9</number>
    </property>
    <property name="spacing" >
     <number>6</number>
    </property>
    <item>
     <widget class="QLabel" name="aLabel" >
      <property name="text" >
       <string>Join the life in the fastlane; - PCH enable your project today! -</string>
      </property>
     </widget>
    </item>
    <item>
     <widget class="QPushButton" name="aButton" >
      <property name="text" >
       <string>&amp;Quit</string>
      </property>
      <property name="shortcut" >
       <string>Alt+Q</string>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
  <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
  <resources/>
  <connections/>
 </ui>

stable.h

 /* Добавляем здесь включения (include) C */

 #if defined __cplusplus
 /* Добавляем здесь включения (include) C++ */

 # include <iostream>
 # include <QApplication>
 # include <QPushButton>
 # include <QLabel>
 #endif

myobject.h

 #include <QObject>

 class MyObject : public QObject
 {
 public:
     MyObject();
     ~MyObject();
 };

myobject.cpp

 #include <iostream>
 #include <QDebug>
 #include <QObject>
 #include "myobject.h"

 MyObject::MyObject()
     : QObject()
 {
     std::cout << "MyObject::MyObject()\n";
 }

util.cpp

 void util_function_does_nothing()
 {
     // Здесь - ничего...
     int x = 0;
     ++x;
 }

main.cpp

 #include <QApplication>
 #include <QPushButton>
 #include <QLabel>
 #include "myobject.h"
 #include "mydialog.h"

 int main(int argc, char **argv)
 {
     QApplication app(argc, argv);

     MyObject obj;
     MyDialog dialog;

     dialog.connect(dialog.aButton, SIGNAL(clicked()), SLOT(close()));
     dialog.show();

     return app.exec();
 }

precompile.pro

 #############################################
 #
 # Пример использования предварительно скомпилированных заголовков
 #
 #############################################
 TEMPLATE  = app
 LANGUAGE  = C++
 CONFIG   += console precompile_header

 # Используем предварительно скомпилированные заголовки (PCH)
 PRECOMPILED_HEADER  = stable.h

 HEADERS   = stable.h \
             mydialog.h \
             myobject.h
 SOURCES   = main.cpp \
             mydialog.cpp \
             myobject.cpp \
             util.cpp
 FORMS     = mydialog.ui

[Предыдущая: Продвинутое использование qmake] [Содержание] [Следующая: Справочник по qmake]


Copyright © 2008 Trolltech Торговые марки
Qt 4.3.5