プリコンパイル済みヘッダーの使用
プリコンパイル済みヘッダー(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.hqmakeが残りの処理を自動的に行い、プリコンパイル済みヘッダーファイルの作成と使用を確実にします。設定でプリコンパイル済みヘッダーがサポートされている場合、qmakeが自動的に処理を行うため、HEADERS にプリコンパイル済みヘッダーファイルを含める必要はありません。
Windows をターゲットとする MSVC および g++ の仕様では、precompile_header がデフォルトで有効になっています。
このオプションを使用すると、プロジェクトファイル内の条件付きブロックをトリガーして、プリコンパイル済みヘッダーを使用する際の設定を追加できます。例:
precompile_header:!isEmpty(PRECOMPILED_HEADER) {
DEFINES += USING_PCH
}MSVCのnmakeターゲット上のCファイルでもプリコンパイル済みヘッダーを使用するには、CONFIG変数にprecompile_header_c を追加します。そのヘッダーがC++でも使用され、C++のキーワードやインクルードが含まれている場合は、それらを#ifdef __cplusplus)で囲んでください。
発生しうる問題に関する注意事項
一部のプラットフォームでは、プリコンパイル済みヘッダーファイルのファイル名拡張子が、他のオブジェクトファイルと同じになります。たとえば、以下の宣言があると、同じ名前の 2 つの異なるオブジェクトファイルが生成される可能性があります:
PRECOMPILED_HEADER = window.h
SOURCES = window.cppこのような競合の可能性を避けるため、プリコンパイルされるヘッダーファイルには、他と区別できる名前を付けてください。
サンプルプロジェクト
以下のソースコードは、Qt ディストリビューションの `examples/qmake/precompile ` ディレクトリにあります:
mydialog.ui
次の画像は、Qt Creator の「デザイン」モードで表示されたmydialog.uiファイルです。「編集」モードではコードを確認できます。

stable.h
/* Add C includes here */
#if defined __cplusplus
/* Add C++ includes here */
# include <iostream>
# include <QApplication>
# include <QPushButton>
# include <QLabel>
#endifmyobject.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.