プリコンパイルヘッダーの使用

プリコンパイル済みヘッダー(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のデザインモードで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

本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。