Auf dieser Seite

Verwendung vorkompilierter Header

Vorkompilierte Header (PCH) sind eine von einigen Compilern unterstützte Leistungsfunktion, mit der ein stabiler Codeabschnitt kompiliert und der kompilierte Zustand des Codes in einer Binärdatei gespeichert wird. Bei nachfolgenden Kompilierungen lädt der Compiler den gespeicherten Zustand und setzt die Kompilierung der angegebenen Datei fort. Jede nachfolgende Kompilierung ist schneller, da der stabile Code nicht erneut kompiliert werden muss.

qmake unterstützt die Verwendung vorkompilierter Header auf einigen Plattformen und in bestimmten Build-Umgebungen, darunter:

  • Windows
    • nmake
    • Visual Studio-Projekte (VS 2008 und höher)
  • macOS, iOS, tvOS und watchOS
    • Makefile
    • Xcode
  • Unix
    • GCC 3.4 und höher
    • clang

Hinzufügen von vorkompilierten Headern zu Ihrem Projekt

Der vorkompilierte Header muss Code enthalten, der in Ihrem gesamten Projekt stabil und statisch ist. Ein typischer vorkompilierter Header könnte wie folgt aussehen:

// 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

Hinweis: In einer vorkompilierten Header-Datei müssen C-Includes von C++-Includes getrennt werden, da die vorkompilierte Header-Datei für C-Dateien keinen C++-Code enthalten darf.

Projektoptionen

Damit Ihr Projekt vorkompilierte Header verwendet, müssen Sie lediglich die Variable PRECOMPILED_HEADER in Ihrer Projektdatei definieren:

PRECOMPILED_HEADER = stable.h

qmake übernimmt den Rest, um die Erstellung und Verwendung der vorkompilierten Header-Datei sicherzustellen. Sie müssen die vorkompilierte Header-Datei nicht in ` HEADERS` einbinden, da qmake dies übernimmt, sofern die Konfiguration vorkompilierte Header unterstützt.

Die MSVC- und g++-Spezifikationen für Windows aktivieren „ precompile_header “ standardmäßig.

Mit dieser Option können Sie bedingte Blöcke in Ihrer Projektdatei auslösen, um Einstellungen bei der Verwendung vorkompilierter Header hinzuzufügen. Zum Beispiel:

precompile_header:!isEmpty(PRECOMPILED_HEADER) {
DEFINES += USING_PCH
}

Um den vorkompilierten Header auch für C-Dateien im MSVC-nmake-Ziel zu verwenden, fügen Sie „ precompile_header_c “ zur Variablen „CONFIG“ hinzu. Wenn der Header auch für C++ verwendet wird und C++-Schlüsselwörter oder -Includes enthält, setzen Sie diese in Anführungszeichen („ #ifdef __cplusplus “).

Hinweise zu möglichen Problemen

Auf einigen Plattformen entspricht die Dateiendung für vorkompilierte Header-Dateien derjenigen für andere Objektdateien. Beispielsweise können die folgenden Deklarationen dazu führen, dass zwei verschiedene Objektdateien mit demselben Namen erzeugt werden:

PRECOMPILED_HEADER = window.h
SOURCES            = window.cpp

Um solche potenziellen Konflikte zu vermeiden, sollten Sie den Header-Dateien, die vorkompiliert werden sollen, eindeutige Namen geben.

Beispielprojekt

Den folgenden Quellcode finden Sie im Verzeichnis „ examples/qmake/precompile “ der Qt-Distribution:

mydialog.ui

Die folgende Abbildung zeigt die Datei „mydialog.ui“ im Design-Modus von „ Qt Creator “. Im Bearbeitungsmodus können Sie den Code einsehen.

Screenshot des Dialogfelds im Entwurfsmodus

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

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.