Sur cette page

Utilisation d'en-têtes précompilés

Les en-têtes précompilés (PCH) sont une fonction de performance prise en charge par certains compilateurs pour compiler un corps de code stable et stocker l'état compilé du code dans un fichier binaire. Lors des compilations suivantes, le compilateur chargera l'état stocké et poursuivra la compilation du fichier spécifié. Chaque compilation ultérieure est plus rapide car le code stable n'a pas besoin d'être recompilé.

qmake prend en charge l'utilisation d'en-têtes précompilés sur certaines plates-formes 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 supérieur
    • clang

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

L'en-tête précompilé doit contenir du code stable et statique tout au long du projet. Un en-tête précompilé typique peut ressembler à ceci :

// 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é pour les fichiers C peut ne 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 s'occupera du reste, pour assurer 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 le fera si la configuration supporte les en-têtes précompilés.

Les spécifications de MSVC et de g++ pour Windows activent precompile_header par défaut.

En utilisant cette option, vous pouvez déclencher des blocs conditionnels dans votre fichier de projet pour 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 C++ et qu'il contient des mots-clés/includes C++, entourez-les de #ifdef __cplusplus).

Notes sur les problèmes éventuels

Sur certaines plates-formes, le suffixe du nom de fichier des fichiers d'en-tête précompilés est le même que celui 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 les conflits potentiels de ce type, donnez des noms distincts 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 sur Qt Creator. Vous pouvez visualiser 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.