Spec-Zone.ru › Qt

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

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

Spec-Zone.ru

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