Использование предварительно скомпилированных заголовков
Предварительно скомпилированные заголовки (PCH) — это функция производительности, поддерживаемая некоторыми компиляторами, для компиляции стабильного блока кода и сохранения скомпилированного состояния кода в двоичном файле. Во время последующих компиляций компилятор загрузит сохранённое состояние и продолжит компиляцию указанного файла. Каждая последующая компиляция происходит быстрее, потому что стабильный код не нужно перекомпилировать.
qmake поддерживает использование предварительно скомпилированных заголовков на некоторых платформах и в средах сборки, включая:
- Windows
- nmake
- Проекты Visual Studio (VS 2008 и более поздние)
- macOS, iOS, tvOS и watchOS
- Makefile
- Xcode
- Unix
- GCC 3.4 и выше
- clang
Добавление предварительно скомпилированных заголовков в проект
Предварительно скомпилированный заголовок должен содержать код, который является стабильным и статичным на протяжении всего проекта. Типичный предварительно скомпилированный заголовок может выглядеть так:
// 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 включают precompile_header по умолчанию.
Используя этот параметр, вы можете активировать условные блоки в файле проекта для добавления настроек при использовании предварительно скомпилированных заголовков. Например:
precompile_header:!isEmpty(PRECOMPILED_HEADER) {
DEFINES += USING_PCH
} Чтобы использовать предварительно скомпилированный заголовок также для C-файлов на целевой платформе MSVC nmake, добавьте precompile_header_c в переменную CONFIG. Если заголовок используется также для C++ и содержит C++ ключевые слова/включения, заключите их в #ifdef __cplusplus.
Примечания по возможным проблемам
На некоторых платформах имя файла предварительно скомпилированного заголовка совпадает с именем файла других объектных файлов. Например, следующие объявления могут привести к генерации двух разных объектных файлов с одинаковым именем:
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 += cmdline precompile_header
# 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/qt-6.2/qmake-precompiledheaders.html