Microsoft Game Development Kit (GDK) での Clang/LLVM の使用
Clang/LLVM を使用した Microsoft Game Development Kit (GDK) タイトルの開発は、Visual Studio 2019 または 2022 と clang/LLVM for Windows ツールセット v12 以降を使用して公式にサポートされています。 このツールセットは、Visual C/C++ ランタイム (ユニバーサル CRT ライブラリ + Microsoft STL) を使用します。 その他のツールセットとランタイムを組み合わせると、正常に動作する場合と動作しない場合があり、また、タイトル認定に合格する場合としない場合があります。
Windows 用 Clang/LLVM と LLVM (clang-cl) (つまり ClangCL) プラットフォームのツールセットは、Microsoft Standard C++ ライブラリを使用します。
Clang のバージョン | Visual Studio更新プログラム |
---|---|
clang v12 | Visual Studio 2019(16.11) |
clang v12 | Visual Studio 2022 (17.0) |
clang v13 | Visual Studio 2022 (17.1) |
clang v13.0.1 | Visual Studio 2022 (17.2) |
clang v14 | Visual Studio 2022 (17.3) |
clang v15.0.1 | Visual Studio 2022 (17.4) |
clang v16.0.5 | Visual Studio 2022 (17.7) |
clang v17.0.3 | Visual Studio 2022 (17.9) |
clang v18.1.8 | Visual Studio 2022 (17.12) プレビュー |
必要な Visual Studio バージョンとコンポーネント
Microsoft Game Development Kit (GDK) で Clang/LLVM を使用するには、Visual Studio バージョン 16.11 以降が必要です。 Visual Studio 2019 をインストールするとき、C++ でデスクトップ開発の下の Windows 用 C++ Clang ツール コンポーネントを選択する必要があります。
使用している Visual Studio のバージョンに応じて、必要な Clang/LLVM コンポーネントには、Windows 用 C++ Clang コンパイラおよびC++ Clang-cl for v142 ビルド ツール (x64/x86) という名前になる場合があります。
注意
Microsoft Game Development Kit (GDK) がインストールされた後に既存の Visual Studio インストールを変更して Windows 用 C++ Clang Tools を追加する場合は、Clang/LLVM を使用する前に Microsoft Game Development Kit (GDK) のインストールを修復する必要があります。
Windows 用 C++ Clang ツール コンポーネントがインストールされている場合、Microsoft ゲーム開発キット (GDK) セットアップは ClangCl プラットフォーム ツールセットGaming.Desktop.x64
プラットフォーム用のサポートをインストールします。
コンパイラとリンカー スイッチ
Gaming.Desktop.x64
プラットフォームの場合、clang-cl.exe
で使用される clang/LLVM コマンドラインには、常に次のものが含まれます。
-Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-reserved-id-macro
-Wno-pragma-pack -Wno-unknown-pragmas
-Wno-unused-command-line-argument
サポートされている CPU 組み込み関数
Clang/LLVM と GNUC は、SSE SIMD 型を Visual C++ や Intel コンパイラとは異なる方法で扱います。 具体的には、__m128、__m128i、__m128d の各型は、構造体ではなく不透明な型とみなされるため、これらの型を使用してC++ オーバーロード関数を作成できません。 これは、__m128.m128_f32[] を介した直接要素アクセスは clang でコンパイルされません。
Clang/LLVM の DirectXMath では、すべての XMVECTOR C++ オーバーロードが無効になります。 DirectXMath ヘッダーを含める前にプリプロセッサ シンボル XM_NO_XMVECTOR_OVERLOADS
XM_NO_XMVECTOR_OVERLOADS を定義することによって、移植性を高めるために Visual C++ でこの動作にオプトインすることもできます。
PC では、SSE と SSE2 がアーキテクチャ定義の一部であるので、すべての x64 ネイティブ CPU でサポートされることを期待できます。 SSE3 は、Windows 10 でサポートされているすべての最新の CPU でサポートされているため、安全に要求することもできます。 DirectXMath の場合、プリプロセッサ定義 を定義できます。_XM_SSE3_INTRINSICS_
また -march=sse3
を使用して clang/LLVM を使用してビルドする必要があります。
Visual C++ では、現在 /arch:AVX または /arch:AVX2 を使用して構築されていない場合でも高度な命令の組み込み関数を使用できますが、clang/LLVM は、このシナリオでは正しいコンパイル スイッチがなく、構築に失敗します。 PC 上の SSE2 以外で使用するものについては、必ずランタイム CPU サポートチェックを行ってください。
Windows 10 SDK (18363) 以前の DirectXMath は、間違った CPUID 組み込み関数を使用して、Clang/LLVM の XMVerifyCPUSupport
を実装しました。 この問題は、Window 10 SDK (19041) 以降の DirectXMath 3.14 で修正されています。
msbuild で Clang/LLVM を使用する
msbuild プロジェクトで Clang/LLVM を使用するには、プラットフォーム ツールセットを "LLVM (clang-cl)" に設定します。 プラットフォーム ツールセットは、次の図に示すように、Visual C++ プロジェクトのプロパティ ダイアログの [全般] タブにあります。
Clang/LLVM ツールセットを設定することもできます。そのためには、次の例に示すように、直接 PlatformToolset msbuild プロパティを ClangCl に設定します。
<PlatformToolset>ClangCl</PlatformToolset>
既定では、Clang/LLVM コンパイラは、MSVC に比べて大幅に多くの警告情報を生成します。 したがって、'TODO' の場所では、警告としての -W#pragma-messages 出力と、-Wunused-value 警告の両方が表示されます。
1>Game.cpp(56,13): warning : Game.cpp: TODO in Update [-W#pragma-messages]
1>Game.cpp(58,5): warning : expression result unused [-Wunused-value]
1>Game.cpp(79,13): warning : Game.cpp: TODO in Render [-W#pragma-messages]
1>Game.cpp(81,5): warning : expression result unused [-Wunused-value]
1>Game.cpp(137,13): warning : Game.cpp: TODO in CreateDeviceDependentResources [-W#pragma-messages]
1>Game.cpp(139,5): warning : expression result unused [-Wunused-value]
1>Game.cpp(145,13): warning : Game.cpp: TODO in CreateWindowSizeDependentResources [-W#pragma-messages]
cmake で Clang/LLVM を使用する
CMakeExample および CMakeGDKExample Microsoft Game 開発キット (GDK) サンプルには、Clang/LLVM を cmake プロジェクトに統合するスタート ポイントが用意されています。 ダウンロード手順については、Microsoft Game 開発キット (GDK) のサンプル を参照してください。
注意
Clang/LLVM のサポートを cmake プロジェクトに追加しようとする前に、Windows 用 C++ CMake ツール Visual Studio コンポーネントがインストールされていることを確認します。 Visual Studio 2019 (16.11) には CMake 3.20 が付属しています。 Visual Studio 2022 には CMake 3.21 以降が付属しています。
CMakeExample の使用
CMakeExample プロジェクトで Clang/LLVM を有効にするには、次の手順を実行します。
- ルート CMakeExampleフォルダー内のデスクトップ フォルダーを開くためには Visual Studio のローカル フォルダーを開く オプションを使用してください。
CMakeExample は、以前の CMakeSettings.json
ソリューションではなく CMakePresets.json
を使用するように、2022 年 3 月に更新されました。 CMake プリセットは、Visual Studio 2019 16.10 以降と統合されています。
こちらのブログ投稿を参照してください。
CMakePresets.json の統合
- ソリューション エクスプローラーで CMakePresets.json ファイルをダブルクリックします。
現在の GDK エディションに合わせて XdkEditionTarget
変数を編集します。
"cacheVariables": {
"XdkEditionTarget": "230300",
"CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}"
}
-
x64-Debug-Clang
またはx64-Release-Clang
プリセットを選択します。
CMakeSettings.json の統合
ソリューション エクスプローラーで CMakeSettings.json ファイルをダブルクリックします。
「プラス」アイコンを選択し、次の図に示すように、「x64-Clang-Debug」および/または「x64-Clang-Release」を選択します。 変更を保存します。
- [Edit Json (Json の編集)] をクリックし、次の例のように、別の構成から変数セクションを切り取り、新しい Clang 構成に貼り付けます。 XDKEditionTarget 値を、お使いの GDK のバージョン (QFE レベルを含む) に適切な値に設定します。
"variables": [
{
"name": "XdkEditionTarget",
"value": "210400",
"type": "STRING"
}
]
- すべての変更を保存した後、ビルド構成ドロップダウンから x64-Clang-Debug または x64-Clang-Release を選択し、ビルドします。
CMakeGDKExample の使用
CMakeGDKExample プロジェクトで Clang/LLVM を有効にするには、次の手順を実行します。
- Visual Studio の [ローカル フォルダーを開く (Open Local Folder)] オプションを使用して、CMakeGDKExample フォルダーを開きます。
CMakePresets.json の統合
- ソリューション エクスプローラーで CMakePresets.json ファイルをダブルクリックします。
現在の GDK エディションに合わせて XdkEditionTarget
変数を編集します。
"cacheVariables": {
"XdkEditionTarget": "230300",
"CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}"
}
-
x64-Desktop-Clang
プリセットを選択します。
CMakeSettings.json の統合
ソリューション エクスプローラーで CMakeSettings.json ファイルをダブルクリックします。
編集する構成を選択し、ツールセットの値を "clang_cl_x64" に設定します。 保存して閉じます。
Xbox One および Xbox Series X|S の構成では、[Json を編集] を選択し、XdkEditionTarget 変数がお使いの GDK エディションおよび QFE レベルと一致していることを確認します。
構成ドロップダウンから目的の値を選択し、[ビルド] メニューから [Rebuild All (すべて再ビルド)] を選択します。
[ファイル] ->[開く] -> [プロジェクト/ソリューション] に進み、生成されたソリューション/プロジェクトを選択します。 例:
CMakeGDKExample\out\build\GamingXboxOne-Debug\CMakeGDKExample.sln
これで、プロジェクトを構築して配置する準備が整いました。
サポートを取得する
Visual C++ コンパイラのバグ報告については、Visual Studio で Report a Problem (問題を報告) を使用してください
clang/LLVM コンパイラのバグ報告については、https://bugs.llvm.org/ を使用してください
Microsoft 標準 C++ ライブラリ (別名 STL) のバグ レポートについては、https://github.com/microsoft/STL/issues を使用してください。
既知の問題
- Clang/LLVM ツールセットは、特に -Wall -Wextra -Wpedantic を使用する場合には、Visual C++ よりも非常に詳細です。 少なくとも、コマンドラインまたは #pragma で次の警告を抑制します。
#ifdef __clang__
#pragma clang diagnostic ignored "-Wc++98-compat"
#pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
#pragma clang diagnostic ignored "-Wgnu-anonymous-struct"
#pragma clang diagnostic ignored "-Wlanguage-extension-token"
#pragma clang diagnostic ignored "-Wnested-anon-types"
#pragma clang diagnostic ignored "-Wreserved-id-macro"
#pragma clang diagnostic ignored "-Wunknown-pragmas"
#endif
The Microsoft Game 開発キット(GDK) ツールは、デバッグ シンボルの Microsoft PDB でしか機能しません。また、LLVM .ld ファイルが発行する CodeView または DWARF デバッグ情報をサポートしていません。
リンク時コード生成の Clang/LLVM の実装は、Microsoft Visual C++ ソリューションとは全く異なります。 リンク時コード生成を使用するコードは、MSVC と clang/LLVM の間では混在できません。
2022 年 10 月のリリースおよび Windows SDK (10.0.22621) の時点で、C++ スタティック ライブラリには eXtended Flow Control Guard (XFG) メタデータが含まれています。 v15 リリースより前の
ld
リンカーでは、これらのライブラリを使用すると、常に無害な警告が出力されます。
lld-link: warning/error: ignoring unknown debug$S subsection kind 0xFF in file xgameruntime.lib