Использование предварительно скомпилированных заголовков
Предварительно скомпилированные заголовки (PCH) — это функция повышения производительности, поддерживаемая некоторыми компиляторами для компиляции стабильного набора кода и хранения скомпилированного состояния кода в двоичном файле. Во время последующих компиляций компилятор загрузит сохранённое состояние и продолжит компиляцию указанного файла. Каждая последующая компиляция выполняется быстрее, потому что стабильный код не нужно перекомпилировать.
qmake поддерживает использование предварительно скомпилированных заголовков на некоторых платформах и в средах сборки, включая:
- Windows
- nmake
- Проекты Visual Studio (VS 2008 и выше)
- macOS, iOS, tvOS и watchOS
- 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$p>Примечание: Файл предварительно скомпилированного заголовка должен разделять C-включения от C++-включений, так как предварительно скомпилированный заголовок для C-файлов может не содержать C++-кода.
Параметры проекта
Для использования предварительно скомпилированных заголовков в вашем проекте вам нужно только определить переменную PRECOMPILED_HEADER в файле проекта:
PRECOMPILED_HEADER = stable.h$p>qmake будет обрабатывать остальное, чтобы гарантировать создание и использование файла предварительно скомпилированного заголовка. Вам не нужно включать файл предварительно скомпилированного заголовка в
HEADERS, так как qmake сделает это, если конфигурация поддерживает предварительно скомпилированные заголовки.Спецификации MSVC и g++ для Windows по умолчанию включают precompile_header.
Используя этот параметр, вы можете активировать условные блоки в вашем файле проекта для добавления настроек при использовании предварительно скомпилированных заголовков. Например:
precompile_header:!isEmpty(PRECOMPILED_HEADER) {
DEFINES += USING_PCH
}$p>Чтобы использовать предварительно скомпилированный заголовок также для C-файлов в MSVC nmake, добавьте precompile_header_c в переменную CONFIG. Если заголовок используется также для C++ и содержит C++-ключевые слова/включения, заключите их в #ifdef __cplusplus.Примечания по возможным проблемам
На некоторых платформах расширение имени файла для предварительно скомпилированных заголовков такое же, как для других объектных файлов. Например, следующие объявления могут привести к генерации двух разных объектных файлов с одинаковым именем:
PRECOMPILED_HEADER = window.h SOURCES = window.cpp$p>Чтобы избежать потенциальных конфликтов, присвойте уникальные имена файлам заголовков, которые будут предварительно компилироваться.
Пример проекта
Следующий исходный код можно найти в каталоге 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$p>
myobject.h
#include <QObject>
class MyObject : public QObject
{
public:
MyObject();
~MyObject();
};$p>myobject.cpp
#include <iostream>
#include <QDebug>
#include <QObject>
#include "myobject.h"
MyObject::MyObject()
: QObject()
{
std::cout << "MyObject::MyObject()\n";
}$p>util.cpp
void util_function_does_nothing()
{
// Nothing here...
int x = 0;
++x;
}$p>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();
}$p>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$p>
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.11/qmake-precompiledheaders.html