必要な Visual Studio のバージョンとコンポーネント
GDK で Clang/LLVM を使用するには、Visual Studio バージョン 16.11 以降が必要です。Visual Studio をインストールする際、[個別のコンポーネント] の下の [C++ Clang Compiler for Windows] コンポーネントを選択してください。 使用している Visual Studio のバージョンによっては、必要な Clang/LLVM コンポーネントの名称が [C++ Clang Compiler for Windows] と [C++ Clang-cl for v142 build tools (x64/x86)] となる場合があります。GDK のインストール後に既存の Visual Studio インストールを変更して [C++ Clang Compiler for Windows] を追加する場合、Clang/LLVM を使用する前に GDK インストールの修復が必要です。
Gaming.Xbox.*.x64 プラットフォーム向けに ClangCl プラットフォーム ツールセットのサポートをインストールします。
コンパイラおよびリンカ スイッチ
Gaming.Xbox.*.x64 プラットフォームで clang-cl.exe と共に使用される clang/LLVM コマンドラインには、常に以下が含まれます。
Gaming.Xbox.Scarlett.x64 の場合、さらに -march=znver2 が追加されます。このスイッチは AVX2 と Hercules CPU 固有のいくつかの機能を有効にします。
Gaming.Xbox.XboxOne.x64 の場合、さらに -march=btver2 が追加されます。このスイッチは AVX、F16C、および Jaguar CPU 固有のいくつかの機能を有効にします。
GDK 開発に推奨されるスイッチの詳細については、Visual C++ コンパイラおよびリンカ スイッチの推奨事項 を参照してください。
サポートされる CPU 組み込み関数
Clang/LLVM と GNUC は、Visual C++ や Intel Compiler とは異なる方法で SSE SIMD 型を扱います。具体的には、__m128、__m128i、および __m128d 型は構造体ではなく不透明型 (opaque types) であるため、これらの型を使用した C++ のオーバーロード関数を作成できません。この違いは、__m128.m128_f32[] を介した直接的な要素アクセスが clang ではコンパイルされないことも意味します。 Clang/LLVM 上の DirectXMath では、この違いにより、すべてのXMVECTOR C++ オーバーロードが無効になります。ポータビリティを高めるため、DirectXMath ヘッダーをインクルードする前にプリプロセッサ シンボル XM_NO_XMVECTOR_OVERLOADS を定義することで、Visual C++ でもこの動作を有効にできます。
Visual C++ では、現在 /arch:AVX または /arch:AVX2 でビルドしていなくても高度な命令組み込み関数を使用できますが、clang/LLVM は適切なコンパイラ スイッチなしではこのシナリオでビルドに失敗します。
Clang/LLVM を使用する際、F16C の半精度変換組み込み関数 _mm_cvtph_ps または _mm_cvtps_ph を使用するには、-march=btver2、-march=znver1、-march=znver2、または -mf16c コンパイラ スイッチを追加する必要があります。
Windows 10 SDK (18363) 以前の DirectXMath では、Clang/LLVM 用の XMVerifyCPUSupport の実装で誤った CPUID 組み込み関数が使用されていました。この問題は Windows 10 SDK (19041) 以降の DirectXMath 3.14 で修正されています。
msbuild での Clang/LLVM の使用
msbuild プロジェクトで Clang/LLVM を使用するには、[プラットフォーム ツールセット] を “LLVM (clang-cl)” に設定します。[プラットフォーム ツールセット] は、次の図に示すように Visual C++ プロジェクト プロパティ ダイアログの [全般] タブの下で見つけられます。 次の例に示すように、PlatformToolset msbuild プロパティを直接 ClangCl に設定して Clang/LLVM ツールセットを設定することもできます。-W#pragma-messages 出力が警告として表示されるとともに、-Wunused-value 警告も表示されます。
cmake での Clang/LLVM の使用
CMakeExample および CMakeGDKExample の GDK サンプルは、cmake プロジェクトに Clang/LLVM を統合するための良い出発点となります。これらのサンプルは XBOX Developer Downloads ページ からダウンロードできます。cmake プロジェクトに Clang/LLVM サポートを追加する前に、[C++ CMake tools for Windows] Visual Studio コンポーネントがインストールされていることを確認してください。Visual Studio 2019 (16.11) には CMake 3.20 が同梱されています。Visual Studio 2022 には CMake 3.21 以降が同梱されています。
CMakeExample の使用
以下の手順に従って、CMakeExample プロジェクトで Clang/LLVM を有効にします。 CMakeExample は 2022 年 3 月に更新され、古いCMakeSettings.json ソリューションではなく CMakePresets.json を使用するようになりました。CMake Presets は Visual Studio 2019 16.10 以降と統合されています。こちらのブログ投稿 を参照してください。
- Visual Studio の [ローカル フォルダーを開く] オプションを使用して、ルートの CMakeExample フォルダー内の Desktop、XBOX Series X|S、または XboxOne フォルダーを開きます。
CMakePresets.json 統合
- ソリューション エクスプローラーで、CMakePresets.json ファイルをダブルクリックします。
XdkEditionTarget 変数を現在の GDK エディションに合わせて編集します。
x64-Debug-Clangまたはx64-Release-Clangプリセットを選択します。
CMakeSettings.json 統合
- ソリューション エクスプローラーで、CMakeSettings.json ファイルをダブルクリックします。
- [プラス] アイコンを選択し、次の図に示すように x64-Clang-Debug と x64-Clang-Release を選択します。変更を保存します。
- [Json の編集] を選択し、次の例のように別の構成から新しい Clang 構成へ変数セクションをカット アンド ペーストします。
XDKEditionTargetの値を、QFE レベルを含む使用中の GDK バージョンに適したものに設定します。
- すべての変更を保存後、ビルド構成ドロップダウンから x64-Clang-Debug または x64-Clang-Release を選択してビルドします。
CMakeGDKExample の使用
以下の手順に従って、CMakeGDKExample プロジェクトで Clang/LLVM を有効にします。- Visual Studio の [ローカル フォルダーを開く] オプションを使用して CMakeGDKExample フォルダーを開きます。
CMakePresets.json 統合
- ソリューション エクスプローラーで、CMakePresets.json ファイルをダブルクリックします。
XdkEditionTarget 変数を現在の GDK エディションに合わせて編集します。
x64-Scarlett-Clangまたはx64-XboxOne-Clangプリセットを選択します。
CMakeSettings.json 統合
- ソリューション エクスプローラーで、CMakeSettings.json ファイルをダブルクリックします。
-
編集する構成を選択します。Toolset 値を
clang_cl_x64に設定します。保存して閉じます。
-
XBOX One および XBOX Series X|S 構成の場合、[Json の編集] を選択し、
XdkEditionTarget変数が GDK エディションおよび QFE レベルと一致していることを確認します。 - 構成ドロップダウンから目的の値を選択し、[ビルド] メニューから [すべて再ビルド] を選択します。
- [ファイル] -> [開く] -> [プロジェクト/ソリューション] を使用して、生成されたソリューションおよびプロジェクトを選択します。例:
サポートの取得
Visual C++ コンパイラのバグ報告には Visual Studio の [問題の報告…] を使用してください。 clang/LLVM コンパイラのバグ報告には https://bugs.llvm.org/ を使用してください。 Microsoft Standard C++ Library (STL とも呼ばれます) のバグ報告には https://github.com/microsoft/STL/issues を使用してください。既知の問題
- Clang/LLVM ツールセットは、特に
-Wall -Wextra -Wpedanticを使用する場合、Visual C++ よりも大幅に冗長です。少なくとも、コマンド ラインまたは#pragmaで以下の警告を抑制してください。
-
XBOX ツールはデバッグ シンボルとして Microsoft PDB のみで動作し、LLVM
.ldファイルが出力する CodeView や DWARF デバッグ情報はサポートしません。 - Clang/LLVM のリンク時コード生成 (Link-Time Code Generation) の実装は、Microsoft Visual C++ のソリューションとは明確に異なります。MSVC と clang/LLVM の間でリンク時コード生成を使用するコードを混在させることはできません。
-
2022 年 10 月リリースおよび Windows SDK (10.0.22621) 以降、C++ スタティック ライブラリには eXtended Flow Control Guard (XFG) メタデータが含まれます。v15 リリース以前の
ldリンカーは、これらのライブラリを使用すると常に無害な警告を発します。
-
vcpkg パッケージ マネージャーの MSBuild 統合は、ライブラリのファイル名にワイルドカードを使用するため、
lld-linkで正しく動作しません。この問題は、vcxproj で<UseLldLink>false</UseLldLink>を設定することで回避できます。この問題は、VS プロジェクト ジェネレーターを使用する vcpkg CMake 統合には影響しません。 - clang v18 の C++20 モードで XBOX 向けにビルドする際、テンプレート評価の変更により、WRL ヘッダーを使用すると 2 つのシンボルが未定義になります。
