Spec-Zone.ru › Qt 5.6

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

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

Spec-Zone.ru

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