[Предыдущая: Продвинутое использование qmake] [Содержание] [Следующая: Справочник по qmake] Использование предварительно скомпилированных заголовков
Предварительно скомпилированные заголовки - средство повышения производительности, поддерживаемое некоторыми компиляторами при компиляции стабильного тела кода и сохранении состояния скомпилированного кода в бинарном файле. Во время последующих компиляций компилятор будет загружать сохраненное состояние и продолжать компиляцию указанного файла. Каждая последующая компиляция проходит быстрее, поскольку не нужно перекомпилировать стабильный код. qmake поддерживает использование предварительно скомпилированных заголовков (precompiled headers, PCH) на некоторых платформах и средах сборки, включающих:
Добавление предварительно скомпилированных заголовков в ваш проектСодержимое файла предварительно скомпилированных заголовковПредварительно скомпилированный заголовок должен содержать код, который является стабильным и статичным во всем вашем проекте. Типичный PCH может выглядеть так: Пример: stable.h// Добавляем здесь включения (include) C #if defined __cplusplus // Добавляем здесь включения (include) C++ #include <stdlib> #include <iostream> #include <vector> #include <QApplication> // Включения (include) Qt #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>&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]
|
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |