プリコンパイルヘッダーの使用
プリコンパイル済みヘッダー(PCH)は、いくつかのコンパイラーでサポートされているパフォーマンス機能で、安定したコード本体をコンパイルし、コードのコンパイル状態をバイナリーファイルに保存します。以降のコンパイルでは、コンパイラーは保存された状態をロードし、指定されたファイルのコンパイルを続行する。安定したコードを再コンパイルする必要がないため、以降のコンパイルは高速になります。
qmake は、以下のようなプラットフォームやビルド環境でのプリコンパイル済みヘッダーの使用をサポートしています:
- Windows
- nmake
- Visual Studio プロジェクト(VS 2008 以降)
- macOS、iOS、tvOS、watchOS
- メイクファイル
- Xcode
- Unix
- GCC 3.4以上
- クラン
プリコンパイルされたヘッダをプロジェクトに追加する
プリコンパイルされたヘッダは、プロジェクト全体を通して安定で静的なコードを含んでいなければなりません。典型的なプリコンパイルされたヘッダは次のようなものです:
// 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++インクルードを分離する必要があります。
プロジェクト・オプション
プロジェクトでプリコンパイルされたヘッダを使うには、プロジェクトファイルでPRECOMPILED_HEADER変数を定義するだけです:
PRECOMPILED_HEADER = stable.h
あとは 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 Design モードで mydialog.ui ファイルを表示しています。編集モードではコードを見ることができます。
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
© 2025 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.