[Предыдущая: Продвинутое использование qmake] [Содержание] [Следующая: Справочник по qmake]
Использование предварительно скомпилированных заголовков
Предварительно скомпилированные заголовки - средство повышения производительности, поддерживаемое некоторыми компиляторами при компиляции стабильного тела кода и сохранении состояния скомпилированного кода в бинарном файле. Во время последующих компиляций компилятор будет загружать сохраненное состояние и продолжать компиляцию указанного файла. Каждая последующая компиляция проходит быстрее, поскольку не нужно перекомпилировать стабильный код.
qmake поддерживает использование предварительно скомпилированных заголовков (precompiled headers, PCH) на некоторых платформах и средах сборки, включающих:
- Windows
- nmake
- Проекты Dsp (VC 6.0)
- Проекты Vcproj (VC 7.0 & 7.1)
- Mac OS X
- Unix
Добавление предварительно скомпилированных заголовков в ваш проект
Содержимое файла предварительно скомпилированных заголовков
Предварительно скомпилированный заголовок должен содержать код, который является стабильным и статичным во всем вашем проекте. Типичный 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
#if defined __cplusplus
# 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]
|