> ## 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 の使用

Clang/LLVM を使用した GDK タイトルの開発は、Visual Studio 2019 または 2022 と *clang/LLVM for Windows* ツールセット v12 以降を使用して正式にサポートされています。このツールセットは Visual C/C++ ランタイム (Universal 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 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) |
| clang v19.1.1 | Visual Studio 2022 (17.13) |
| clang v19.1.5 | Visual Studio 2022 (17.14) |

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

Microsoft Game Development Kit (GDK) で Clang/LLVM を使用するには、Visual Studio バージョン 16.11 以降が必要です。Visual Studio 2019 のインストール時には、**\[C++ によるデスクトップ開発]** 下の **\[C++ Clang Tools 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>Microsoft Game Development Kit (GDK) をインストールした後で、既存の Visual Studio インストールを変更して **\[C++ Clang Tools for Windows]** を追加した場合は、Clang/LLVM を使用する前に Microsoft Game Development Kit (GDK) のインストールを修復する必要があります。</Note>

**\[C++ Clang Tools for Windows]** コンポーネントがインストールされていれば、Microsoft Game Development Kit (GDK) のセットアップにより、`Gaming.Desktop.x64` プラットフォーム用の **ClangCl** プラットフォーム ツールセットのサポートがインストールされます。

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

`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 Compiler とは異なる方法で扱います。具体的には、\_\_m128、\_\_m128i、\_\_m128d 型は構造体ではなく不透明な型として扱われるため、これらの型を使用した C++ オーバーロード関数を作成できません。これは、\_\_m128.m128\_f32\[] を介した要素への直接アクセスも clang ではコンパイルされないことを意味します。

Clang/LLVM 上の DirectXMath では、その結果として、すべての XMVECTOR C++ オーバーロードが無効化されます。移植性を高めるために、DirectXMath ヘッダーをインクルードする前にプリプロセッサ シンボル `XM_NO_XMVECTOR_OVERLOADS` を定義することで、Visual C++ でもこの動作を選択できます。

PC の場合、SSE および SSE2 はアーキテクチャ定義の一部であるため、すべての x64 ネイティブ CPU でサポートされていることを前提とできます。また、SSE3 は Windows 10 でサポートされるすべての最新 CPU でサポートされているため、安全に要求できます。DirectXMath については、これはプリプロセッサ定義 `_XM_SSE3_INTRINSICS_` を定義し、clang/LLVM で `-march=sse3` を使用してビルドする必要があることを意味します。

Visual C++ では、現在 /arch:AVX または /arch:AVX2 でビルドしていなくても高度な命令組み込み関数を使用できますが、clang/LLVM では適切なコンパイラ スイッチがない限りこのシナリオでビルドに失敗します。PC で SSE2 を超えるものを使用する場合は、必ず実行時に CPU サポート チェックを行ってください。

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/NsRUQ49ZRpXgoZ9R/images/gdk/tools/vs_gr_clang_msbuild_property.png?fit=max&auto=format&n=NsRUQ49ZRpXgoZ9R&q=85&s=7b0a16b440e2f0e2aa2aebdae361e799" alt="Clang/LLVM msbuild プロパティ" width="826" height="548" data-path="images/gdk/tools/vs_gr_clang_msbuild_property.png" />

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

```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 の Microsoft Game Development Kit (GDK) サンプルは、cmake プロジェクトに Clang/LLVM を統合する際の良い出発点となります。ダウンロード手順については、[Microsoft Game Development Kit (GDK) サンプル](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/development-downloads/gdk-samples-home)を参照してください。

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

### CMakeExample を使用する

CMakeExample プロジェクトで Clang/LLVM を有効にするには、次の手順に従います。

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

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

### CMakePresets.json の統合

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

`XdkEditionTarget` 変数を編集して、現在の GDK エディションと一致させます。

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

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

### CMakeSettings.json の統合

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

3. 次の図に示すように、「PLUS」アイコンを選択し、「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="cmake プロジェクトへの Clang 構成の追加" width="634" height="612" data-path="images/gdk/tools/vs_clang_cmake_add_config_cmakeexample.png" />

4. \[Edit Json] をクリックし、次の例のように別の構成の variables セクションを新しい Clang 構成に切り取って貼り付けます。QFE レベルを含め、お使いの GDK のバージョンに適した値を XDKEditionTarget に設定します。

```
"variables": [
  {
    "name": "XdkEditionTarget",
    "value": "210400",
    "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": "250400",
  "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}"
}
```

3. `x64-Desktop-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="Toolset の値を「clang_cl_x64」に設定する" width="920" height="608" data-path="images/gdk/tools/vs_clang_cmake_set_toolsset_cmakegdkexample.png" />

4. XBOX One および XBOX Series X|S 構成については、**\[Edit 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 ツールセットは Visual C++ に比べて、特に -Wall -Wextra -Wpedantic を使用するとかなり冗長になります。少なくとも、次の警告をコマンド ラインまたは #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
```

* Microsoft Game Development Kit (GDK) のツールは、デバッグ シンボルとして 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
```

## 関連項目

[Visual Studio](/tools/tools-pc/visualstudio/gr-visualstudio-toc)

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

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


## Related topics

- [コンソール向け GDK で Clang/LLVM を使用する](/ja-jp/tools/tools-console/visualstudio/vs-clang.md)
- [Godot で GDK を使用する](/ja-jp/build/gdk-and-engines/godot.md)
- [Unity で GDK を使用する](/ja-jp/build/gdk-and-engines/unity/unity.md)
- [Unreal Engine で GDK を使用する](/ja-jp/build/gdk-and-engines/unreal/unreal.md)
- [GameMaker で GDK を使用する](/ja-jp/build/gdk-and-engines/gamemaker.md)
