> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# コンソール向け GDK で Clang/LLVM を使用する

> コンソール向け Microsoft Game Development Kit (GDK) での Clang/LLVM の使用

Microsoft Game Development Kit (GDK) タイトルは、Visual Studio 2019、Visual Studio 2022、または Visual Studio 2026 と *clang/LLVM for Windows* ツールセット v12 以降を組み合わせて Clang/LLVM を使用して開発できます。このツールセットは Visual C/C++ ランタイム (ユニバーサル CRT ライブラリ + Microsoft STL) を使用します。他のツールセットとランタイムの組み合わせは正常に実行されなかったり、タイトル認定に合格しない場合があります。

**LLVM (clang-cl)** (すなわち ClangCL) プラットフォーム ツールセットを使用する Clang/LLVM for Windows は、[Microsoft Standard C++ Library](https://github.com/microsoft/STL) を使用します。

| Clang バージョン   | Visual Studio 更新           |
| ------------- | -------------------------- |
| clang v12     | Visual Studio 2019 (16.11) |
| clang v18.1.8 | Visual Studio 2022 (17.12) |
| clang v19.1.5 | Visual Studio 2022 (17.14) |
| clang v20.1.8 | Visual Studio 2026 (18.0)  |

## 必要な Visual Studio のバージョンとコンポーネント

GDK で Clang/LLVM を使用するには、Visual Studio バージョン 16.11 以降が必要です。Visual Studio をインストールする際、**\[個別のコンポーネント]** の下の **\[C++ Clang Compiler for Windows]** コンポーネントを選択してください。

<img src="https://mintcdn.com/microsoft-4404708b/6TXzXmujKayly5Sf/images/gdk/tools/vs_clang_install_options.png?fit=max&auto=format&n=6TXzXmujKayly5Sf&q=85&s=c70a80a7305443c1b6a2dd9d1ef8efae" alt="Clang Tools for Windows" width="630" height="378" data-path="images/gdk/tools/vs_clang_install_options.png" />

使用している Visual Studio のバージョンによっては、必要な Clang/LLVM コンポーネントの名称が **\[C++ Clang Compiler for Windows]** と **\[C++ Clang-cl for v142 build tools (x64/x86)]** となる場合があります。

<Note>GDK のインストール後に既存の Visual Studio インストールを変更して **\[C++ Clang Compiler for Windows]** を追加する場合、Clang/LLVM を使用する前に GDK インストールの修復が必要です。</Note>

**\[C++ Clang Compiler for Windows]** コンポーネントをインストールすると、GDK セットアップは `Gaming.Xbox.*.x64` プラットフォーム向けに **ClangCl** プラットフォーム ツールセットのサポートをインストールします。

## コンパイラおよびリンカ スイッチ

`Gaming.Xbox.*.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
```

`Gaming.Xbox.Scarlett.x64` の場合、さらに `-march=znver2` が追加されます。このスイッチは AVX2 と Hercules CPU 固有のいくつかの機能を有効にします。

`Gaming.Xbox.XboxOne.x64` の場合、さらに `-march=btver2` が追加されます。このスイッチは AVX、F16C、および Jaguar CPU 固有のいくつかの機能を有効にします。

GDK 開発に推奨されるスイッチの詳細については、[Visual C++ コンパイラおよびリンカ スイッチの推奨事項](/tools/tools-console/visualstudio/compiler-switch-recommendations) を参照してください。

## サポートされる 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 で修正されています。

* [https://walbourn.github.io/directxmath-3.14/](https://walbourn.github.io/directxmath-3.14/)

## msbuild での Clang/LLVM の使用

msbuild プロジェクトで Clang/LLVM を使用するには、**\[プラットフォーム ツールセット]** を "LLVM (clang-cl)" に設定します。**\[プラットフォーム ツールセット]** は、次の図に示すように Visual C++ プロジェクト プロパティ ダイアログの **\[全般]** タブの下で見つけられます。

<img src="https://mintcdn.com/microsoft-4404708b/6TXzXmujKayly5Sf/images/gdk/tools/vs_clang_msbuild_property.png?fit=max&auto=format&n=6TXzXmujKayly5Sf&q=85&s=260bbf1445110c95ef709030e4561d22" alt="Clang/LLVM msbuild property" width="783" height="513" data-path="images/gdk/tools/vs_clang_msbuild_property.png" />

次の例に示すように、**PlatformToolset** msbuild プロパティを直接 **ClangCl** に設定して Clang/LLVM ツールセットを設定することもできます。

```xml theme={null}

<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 の GDK サンプルは、cmake プロジェクトに Clang/LLVM を統合するための良い出発点となります。これらのサンプルは [XBOX Developer Downloads ページ](https://aka.ms/gdkdl) からダウンロードできます。

<Note>cmake プロジェクトに Clang/LLVM サポートを追加する前に、**\[C++ CMake tools for Windows]** Visual Studio コンポーネントがインストールされていることを確認してください。Visual Studio 2019 (16.11) には CMake 3.20 が同梱されています。Visual Studio 2022 には CMake 3.21 以降が同梱されています。</Note>

### CMakeExample の使用

以下の手順に従って、CMakeExample プロジェクトで Clang/LLVM を有効にします。

CMakeExample は 2022 年 3 月に更新され、古い `CMakeSettings.json` ソリューションではなく `CMakePresets.json` を使用するようになりました。CMake Presets は Visual Studio 2019 16.10 以降と統合されています。[こちらのブログ投稿](https://devblogs.microsoft.com/cppblog/cmake-presets-integration-in-visual-studio-and-visual-studio-code/) を参照してください。

1. Visual Studio の **\[ローカル フォルダーを開く]** オプションを使用して、ルートの CMakeExample フォルダー内の Desktop、XBOX Series X|S、または XboxOne フォルダーを開きます。

### CMakePresets.json 統合

2. ソリューション エクスプローラーで、CMakePresets.json ファイルをダブルクリックします。

`XdkEditionTarget` 変数を現在の GDK エディションに合わせて編集します。

```
"cacheVariables": {
  "XdkEditionTarget": "260400",
  "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}"
}
```

3. `x64-Debug-Clang` または `x64-Release-Clang` プリセットを選択します。

### CMakeSettings.json 統合

2. ソリューション エクスプローラーで、CMakeSettings.json ファイルをダブルクリックします。

3. **\[プラス]** アイコンを選択し、次の図に示すように **x64-Clang-Debug** と **x64-Clang-Release** を選択します。変更を保存します。

<img src="https://mintcdn.com/microsoft-4404708b/6TXzXmujKayly5Sf/images/gdk/tools/vs_clang_cmake_add_config_cmakeexample.png?fit=max&auto=format&n=6TXzXmujKayly5Sf&q=85&s=94202af0a719e19ce9573f71e1b925a5" alt="Adding a Clang configuration in a cmake project" width="634" height="612" data-path="images/gdk/tools/vs_clang_cmake_add_config_cmakeexample.png" />

4. **\[Json の編集]** を選択し、次の例のように別の構成から新しい Clang 構成へ変数セクションをカット アンド ペーストします。`XDKEditionTarget` の値を、QFE レベルを含む使用中の GDK バージョンに適したものに設定します。

```
"variables": [
  {
    "name": "XdkEditionTarget",
    "value": "260400",
    "type": "STRING"
  }
]

```

5. すべての変更を保存後、ビルド構成ドロップダウンから **x64-Clang-Debug** または **x64-Clang-Release** を選択してビルドします。

## CMakeGDKExample の使用

以下の手順に従って、CMakeGDKExample プロジェクトで Clang/LLVM を有効にします。

1. Visual Studio の **\[ローカル フォルダーを開く]** オプションを使用して CMakeGDKExample フォルダーを開きます。

### CMakePresets.json 統合

2. ソリューション エクスプローラーで、CMakePresets.json ファイルをダブルクリックします。

`XdkEditionTarget` 変数を現在の GDK エディションに合わせて編集します。

```
"cacheVariables": {
  "XdkEditionTarget": "260400",
  "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}"
}
```

3. `x64-Scarlett-Clang` または `x64-XboxOne-Clang` プリセットを選択します。

### CMakeSettings.json 統合

2. ソリューション エクスプローラーで、CMakeSettings.json ファイルをダブルクリックします。

3. 編集する構成を選択します。Toolset 値を `clang_cl_x64` に設定します。保存して閉じます。

<img src="https://mintcdn.com/microsoft-4404708b/6TXzXmujKayly5Sf/images/gdk/tools/vs_clang_cmake_set_toolsset_cmakegdkexample.png?fit=max&auto=format&n=6TXzXmujKayly5Sf&q=85&s=dd9392aa02da7d03720e745201a921a1" alt="Setting the Toolset value to &#x22;clang_cl_x64&#x22;" width="920" height="608" data-path="images/gdk/tools/vs_clang_cmake_set_toolsset_cmakegdkexample.png" />

4. XBOX One および XBOX Series X|S 構成の場合、**\[Json の編集]** を選択し、`XdkEditionTarget` 変数が GDK エディションおよび QFE レベルと一致していることを確認します。

5. 構成ドロップダウンから目的の値を選択し、**\[ビルド]** メニューから **\[すべて再ビルド]** を選択します。

6. **\[ファイル]** -> **\[開く]** -> **\[プロジェクト/ソリューション]** を使用して、生成されたソリューションおよびプロジェクトを選択します。例:

CMakeGDKExample\out\build\GamingXboxOne-Debug\CMakeGDKExample.sln

これでプロジェクトをビルドおよびデプロイする準備が整いました。

## サポートの取得

Visual C++ コンパイラのバグ報告には [Visual Studio の \[問題の報告…\]](https://learn.microsoft.com/visualstudio/ide/how-to-report-a-problem-with-visual-studio) を使用してください。

clang/LLVM コンパイラのバグ報告には [https://bugs.llvm.org/](https://bugs.llvm.org/) を使用してください。

Microsoft Standard C++ Library (STL とも呼ばれます) のバグ報告には [https://github.com/microsoft/STL/issues](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
```

* 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` リンカーは、これらのライブラリを使用すると常に無害な警告を発します。

```
lld-link: warning/error: ignoring unknown debug$S subsection kind 0xFF in file xgameruntime.lib
```

* vcpkg パッケージ マネージャーの MSBuild 統合は、ライブラリのファイル名にワイルドカードを使用するため、`lld-link` で正しく動作しません。この問題は、vcxproj で `<UseLldLink>false</UseLldLink>` を設定することで回避できます。この問題は、VS プロジェクト ジェネレーターを使用する vcpkg CMake 統合には影響しません。

* clang v18 の C++20 モードで XBOX 向けにビルドする際、テンプレート評価の変更により、WRL ヘッダーを使用すると 2 つのシンボルが未定義になります。

```
wrl\implements.h(115,11): error : no member named 'RoOriginateError' in the global namespace
wrl/event.h(681,17): error : no member named 'RoTransformError' in the global namespace
wrl/event.h(712,18): error : no member named 'RoTransformError' in the global namespace
```

以下の回避策で問題を解決できます。

```cpp theme={null}
#include <wrl/client.h>

#if (__cplusplus >= 202002L) && (WINAPI_FAMILY == WINAPI_FAMILY_GAMES)
inline BOOL RoOriginateError(HRESULT, HSTRING) { return TRUE; }
inline BOOL RoTransformError(HRESULT, HRESULT, HSTRING) { return TRUE; }
#endif

#include <wrl/event.h>
```

## 関連項目

[Visual Studio](/tools/tools-console/visualstudio/visualstudio)

[Visual C++ コンパイラおよびリンカ スイッチの推奨事項](/tools/tools-console/visualstudio/compiler-switch-recommendations)

[Clang/LLVM での CMake の使用](https://learn.microsoft.com/cpp/build/clang-support-cmake)

[Clang/LLVM での MSBuild の使用](https://learn.microsoft.com/cpp/build/clang-support-msbuild)


## Related topics

- [GDK で Clang/LLVM を使用する](/ja-jp/tools/tools-pc/visualstudio/gr-vs-clang.md)
- [NuGet を使用した PC およびコンソール向け GameInput](/ja-jp/build/core-features/common/input/overviews/input-nuget.md)
- [Unity で GDK を使用する](/ja-jp/build/gdk-and-engines/unity/unity.md)
- [Godot で GDK を使用する](/ja-jp/build/gdk-and-engines/godot.md)
- [コンソール開発向け Visual Studio](/ja-jp/tools/tools-console/visualstudio/visualstudio.md)
