Использование предварительно скомпилированных заголовков
Предварительно скомпилированные заголовки (PCH) — это функция производительности, поддерживаемая некоторыми компиляторами для компиляции стабильного блока кода и хранения скомпилированного состояния кода в бинарном файле. Во время последующих компиляций компилятор загрузит сохраненное состояние и продолжит компиляцию указанного файла. Каждая последующая компиляция происходит быстрее, потому что стабильный код не нужно перекомпилировать.
qmake поддерживает использование предварительно скомпилированных заголовков на некоторых платформах и в средах разработки, включая:
- Windows
- nmake
- Проекты Visual Studio (VS 2008 и выше)
- macOS и iOS
- Makefile
- Xcode
- Unix
- GCC 3.4 и выше
Добавление предварительно скомпилированных заголовков в проект
Предварительно скомпилированный заголовок должен содержать код, который является стабильным и статичным на протяжении всего проекта. Типичный предварительно скомпилированный заголовок может выглядеть так:
// 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++-код.
Параметры проекта
Чтобы ваш проект использовал предварительно скомпилированные заголовки, вам нужно только определить переменную PRECOMPILED_HEADER в файле проекта:
PRECOMPILED_HEADER = stable.h
qmake будет обрабатывать остальное, чтобы обеспечить создание и использование файла предварительно скомпилированного заголовка. Вам не нужно включать файл предварительно скомпилированного заголовка в HEADERS, так как qmake сделает это, если конфигурация поддерживает предварительно скомпилированные заголовки.
Спецификации MSVC и g++ для Windows (и Windows CE) включают precompile_header по умолчанию.
Используя этот параметр, вы можете использовать условные блоки в файле проекта для добавления настроек при использовании предварительно скомпилированных заголовков. Например:
precompile_header:!isEmpty(PRECOMPILED_HEADER) {
DEFINES += USING_PCH
} Примечания по возможным проблемам
На некоторых платформах расширение файла для предварительно скомпилированных заголовков такое же, как для других объектных файлов. Например, следующие объявления могут привести к генерации двух разных объектных файлов с одинаковым именем:
PRECOMPILED_HEADER = window.h SOURCES = window.cpp
Чтобы избежать таких потенциальных конфликтов, присвойте отличительные имена файлам заголовков, которые будут предварительно скомпилированы.
Пример проекта
Вы можете найти следующий исходный код в каталоге examples/qmake/precompile в дистрибутиве Qt:
mydialog.ui
На следующем изображении показан файл mydialog.ui в режиме проектирования Qt Creator. Вы можете просмотреть код в режиме редактирования.
stable.h
/* Add C includes here */ #if defined __cplusplus /* Add C++ includes here */ # 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()
{
// Nothing here...
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
CONFIG -= app_bundle
# Use Precompiled headers (PCH)
PRECOMPILED_HEADER = stable.h
HEADERS = stable.h \
mydialog.h \
myobject.h
SOURCES = main.cpp \
mydialog.cpp \
myobject.cpp \
util.cpp
FORMS = mydialog.ui
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.6/qmake-precompiledheaders.html