C++のコンパイルは時間がかかる。ソースファイルでインクルードされている全てのファイルをパースしなければならないため。C++ではヘッダに実装を書く事も多くなりさらに重くなっている。
プリコンパイルヘッダとはソースコードの共通の最初の部分をあらかじめコンパイルしておきそれを共通で利用する方法。最初の部分は共通でないとならないので、その共通の部分を1つのヘッダファイルにしておき、ソースコードではそれをファイルの先頭でインクルードすることで利用する。経験上ではMicrosoftのclコンパイラだととても早くなる。
この共通の部分には普通は他のライブラリのヘッダファイル、例えばWindows.hやstringやvectorなどの標準ライブラリなど自分で編集しないファイルをおく。
Visual Studioでソリューションを作成すると自動でこのプリコンパイルをやってくれるが、QtのQt Creatorなどではやってくれないのでその方法。
*.proファイルにPRECOMPILED_HEADERを追加
以下の行を*.proファイルに追加する。
1 |
PRECOMPILED_HEADER = stable.h |
stable.hの名前は好きでいいはず。Visual StudioなどではStdAfx.hやpch.hに相当する。
stable.hを新規にプロジェクトに追加
stable.hを新規にプロジェクトに追加してそこに共通の#includeを書く、QtなのでQで始まるファイルが多くなると思われる。ここではソースファイル郡から検索する方法を紹介。
コマンドで#includeを見つける
以下のコマンドはsrc/以下から全てのファイルを検索してインクルードを見つける。
1 |
$ grep -h '^\s*#include\s*<' src/ -R | sort | uniq |
-hはファイル名を表示しないオプション。このコマンドで表示されたものをstable.hに書く。以下は例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#ifndef STABLE_H #define STABLE_H #include <QApplication> #include <QDesktopWidget> #include <QDir> #include <QFileDialog> #include <QMainWindow> #include <QMessageBox> #include <QSessionManager> #include <QSettings> #include <QStandardPaths> #include <QTextStream> #endif // STABLE_H |
準備完了
これでプリコンパイルの準備は出来た。Visual Studioとは違いソースコードでstable.hをインクルードしなくても良い。勝手にやってくれるようだ。ソースコード中の今までのインクルードは別にそのままでも良い、というかそのままにしておくべき。プリコンパイルを利用できない環境だと困るため。通常はすでにインクルードされているものは除外するように記述されているので問題ない。
ビルドをして早くなったか確認する。