プリコンパイル済みヘッダー
システムライブラリのヘッダーファイルの解析は、驚くほどコストがかかります。一般的なソースファイルは1000行未満のコードですが、大規模なライブラリのヘッダーは数万行になることがあります。これは、ヘッダーのみのライブラリが一般的で、非常に複雑なコードを含む可能性のあるC++では特に問題となります。そのため、コンパイルに時間がかかります。
プリコンパイル済みヘッダーは、この問題を軽減するためのツールです。基本的には、ヘッダーを解析し、コンパイラの内部状態をディスクにシリアライズします。プリコンパイル済みヘッダーの欠点は、設定が難しいことです。Mesonはプリコンパイル済みヘッダーをネイティブでサポートしていますが、使用するには少し作業が必要です。
プリコンパイル済みヘッダーファイルは比較的単純です。プリコンパイルするシステムヘッダーの#include
ディレクティブを含むヘッダーファイルです。C++の例を次に示します。
#include<vector>
#include<string>
#include<map>
Mesonでは、プリコンパイル済みヘッダーファイルは常にターゲットごとです。つまり、指定されたプリコンパイル済みヘッダーは、ターゲット内のすべてのファイルをコンパイルするときに使用されます。基盤となるコンパイラの制限により、このヘッダーファイルはソースファイルと同じサブディレクトリにあってはなりません。ターゲットディレクトリにpch
というサブディレクトリを作成し、そこにヘッダーファイル(とそれ以外の何もない)を配置することを強くお勧めします。
プリコンパイル済みヘッダーの使用の切り替え
プリコンパイル済みヘッダーなしでプロジェクトをコンパイルする場合は、設定時にMesonに-Db_pch=false
引数を渡すか、後でmeson configure
を使用してpchオプションの値を変更できます。 GUIツールを使用して、設定済みのビルドディレクトリでpchの使用を切り替えることもできます。ソースコードを変更する必要はありません。通常、これは、プロジェクトがpchなしできれいにコンパイルされるかどうか(つまり、その#includesが順序どおりであるかどうかを確認する)と、コンパイラのバグを回避するために実行されます。
GCCおよびその派生物でのプリコンパイル済みヘッダーの使用
プリコンパイルするファイルを作成したら、*pch*キーワード引数を使用して、特定のターゲットに対してpchの使用を有効にできます。例として、プリコンパイル済みヘッダーを使用して小さなCバイナリをビルドするとします。バイナリのソースファイルがシステムヘッダーstdio.h
とstring.h
を使用するとします。次に、この内容のヘッダーファイルpch/myexe_pch.h
を作成します
#include <stdio.h>
#include <string.h>
そしてこれをMesonに追加します
executable('myexe', sources : sourcelist, c_pch : 'pch/myexe_pch.h')
それだけです。ソースファイルにはmyexe_pch.h
ファイルを含めてはならず、pchサブディレクトリを検索パスに追加してはならないことに注意してください。元のプログラムファイルの変更は必要ありません。 Mesonは、コンパイラオプションを使用してコンパイラにpchを含めます。 pchを無効にする場合(たとえば、コンパイラのバグのため)、ソースコードを変更せずにビルドシステム側で完全に実行できます。
任意のビルドターゲットでプリコンパイル済みヘッダーを使用できます。ターゲットに複数の言語がある場合は、次のように複数のpchファイルを指定できます。
executable('multilang', sources : srclist,
c_pch : 'pch/c_pch.h', cpp_pch : 'pch/cpp_pch.h')
MSVCでのプリコンパイル済みヘッダーの使用
Mesonバージョン0.50.0以降、MSVCでのプリコンパイル済みヘッダーはGCCと同様に機能します。 Mesonは、一致するpch実装ファイルを自動的に作成します。
バージョン0.50.0より前は、ヘッダーファイルに加えて、Mesonには対応するソースファイルも必要でした。ヘッダーがfoo_pch.h
と呼ばれる場合、対応するソースファイルは通常foo_pch.cpp
と呼ばれ、ヘッダーと同じpch
サブディレクトリにあります。その内容は次のとおりです
#if !defined(_MSC_VER)
#error "This file is only for use with MSVC."
#endif
#include "foo_pch.h"
pchを有効にするには、ターゲット定義に両方のファイルをリストするだけです
executable('myexe', sources : srclist,
cpp_pch : ['pch/foo_pch.h', 'pch/foo_pch.cpp'])
MesonはGCCに.cpp
ファイルが不要であることを認識し、単にそれを無視するため、この形式はGCCとmsvcの両方で機能します。
MSVCコンパイラの実装の詳細により、同じターゲットに複数の言語のプリコンパイル済みヘッダーを使用することは、必ずしも機能するとは限りません。
検索結果は次のとおりです。