Sur cette page

Utilisation des en-têtes précompilés

Les en-têtes précompilés (PCH) sont une fonctionnalité optimisant les performances, prise en charge par certains compilateurs, qui permet de compiler une partie stable du code et de stocker l'état compilé de ce code dans un fichier binaire. Lors des compilations suivantes, le compilateur charge l'état stocké et poursuit la compilation du fichier spécifié. Chaque compilation suivante est plus rapide, car le code stable n'a pas besoin d'être recompilé.

qmake prend en charge l'utilisation des en-têtes précompilés sur certaines plateformes et dans certains environnements de compilation, notamment :

  • Windows
    • nmake
    • Projets Visual Studio (VS 2008 et versions ultérieures)
  • macOS, iOS, tvOS et watchOS
    • Makefile
    • Xcode
  • Unix
    • GCC 3.4 et versions ultérieures
    • clang

Ajouter des en-têtes précompilés à votre projet

L'en-tête précompilé doit contenir du code stable et statique dans l'ensemble de votre projet. Voici à quoi peut ressembler un en-tête précompilé type :

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

Remarque : un fichier d'en-tête précompilé doit séparer les inclusions C des inclusions C++, car le fichier d'en-tête précompilé destiné aux fichiers C ne doit pas contenir de code C++.

Options du projet

Pour que votre projet utilise des en-têtes précompilés, il vous suffit de définir la variable PRECOMPILED_HEADER dans votre fichier de projet :

PRECOMPILED_HEADER = stable.h

qmake se chargera du reste, afin de garantir la création et l’utilisation du fichier d’en-tête précompilé. Vous n’avez pas besoin d’inclure le fichier d’en-tête précompilé dans ` HEADERS`, car qmake s’en chargera si la configuration prend en charge les en-têtes précompilés.

Les spécifications MSVC et g++ ciblant Windows activent par défaut l’option « precompile_header ».

Grâce à cette option, vous pouvez déclencher des blocs conditionnels dans votre fichier de projet afin d’ajouter des paramètres lors de l’utilisation d’en-têtes précompilés. Par exemple :

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

Pour utiliser l’en-tête précompilé également pour les fichiers C sur la cible nmake de MSVC, ajoutez precompile_header_c à la variable CONFIG. Si l’en-tête est également utilisé pour le C++ et qu’il contient des mots-clés ou des inclusions C++, encadrez-les par #ifdef __cplusplus).

Remarques sur les problèmes éventuels

Sur certaines plateformes, l’extension des fichiers d’en-tête précompilés est identique à celle des autres fichiers objets. Par exemple, les déclarations suivantes peuvent entraîner la génération de deux fichiers objets différents portant le même nom :

PRECOMPILED_HEADER = window.h
SOURCES            = window.cpp

Pour éviter ce type de conflits potentiels, attribuez des noms distinctifs aux fichiers d'en-tête qui seront précompilés.

Exemple de projet

Vous trouverez le code source suivant dans le répertoire examples/qmake/precompile de la distribution Qt :

mydialog.ui

L’image suivante affiche le fichier mydialog.ui en mode Conception dans Qt Creator. Vous pouvez consulter le code en mode Édition.

Capture d'écran de la boîte de dialogue en mode conception

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.