Spec-Zone.ru › Qt 5.11

Использование предварительно скомпилированных заголовков

Предварительно скомпилированные заголовки (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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API