> ## 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 사용

Visual Studio 2019, Visual Studio 2022 또는 Visual Studio 2026과 *Windows용 clang/LLVM* 도구 세트 v12 이상을 사용하여 Microsoft Game Development Kit (GDK) 타이틀을 Clang/LLVM으로 개발할 수 있습니다. 이 도구 세트는 Visual C/C++ 런타임(Universal CRT 라이브러리 + Microsoft STL)을 사용합니다. 다른 도구 세트와 런타임 조합은 성공적으로 실행되지 않거나 타이틀 인증을 통과하지 못할 수 있습니다.

**LLVM (clang-cl)**(즉, ClangCL) 플랫폼 도구 세트가 있는 Windows용 Clang/LLVM은 [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는 SSE SIMD 형식을 Visual C++ 및 Intel Compiler와 다르게 취급합니다. 구체적으로 \_\_m128, \_\_m128i, \_\_m128d 형식은 구조체가 아닌 불투명한 형식이므로 이러한 형식을 사용하는 C++ 오버로드 함수를 만들 수 없습니다. 이러한 차이로 인해 \_\_m128.m128\_f32\[]을 통한 직접 요소 접근도 clang에서 컴파일되지 않습니다.

Clang/LLVM에서 DirectXMath의 경우 이러한 차이로 인해 모든 `XMVECTOR` C++ 오버로드가 비활성화됩니다. Visual C++에서도 이식성 향상을 위해 DirectXMath 헤더를 포함하기 전에 전처리기 심볼 `XM_NO_XMVECTOR_OVERLOADS`를 정의하여 이 동작을 선택할 수 있습니다.

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을 사용하려면 **Platform Toolset**을 "LLVM (clang-cl)"로 설정합니다. 다음 그림과 같이 Visual C++ 프로젝트 속성 대화 상자의 **일반** 탭에서 **Platform Toolset**을 찾을 수 있습니다.

<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 속성" 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 샘플은 Clang/LLVM을 cmake 프로젝트에 통합하는 좋은 출발점을 제공합니다. 이러한 샘플은 [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. **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 구성에 붙여넣습니다. `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="Toolset 값을 &#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 구성의 경우 **Edit Json**을 선택하고 `XdkEditionTarget` 변수가 GDK 에디션과 QFE 수준과 일치하는지 확인합니다.

5. 구성 드롭다운에서 원하는 값을 선택하고 **빌드** 메뉴에서 **모두 다시 빌드**를 선택합니다.

6. **파일** -> **열기** -> **프로젝트/솔루션**을 사용하여 생성된 솔루션과 프로젝트를 선택합니다. 예:

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

이제 프로젝트를 빌드하고 배포할 준비가 완료되었습니다.

## 지원 받기

Visual C++ 컴파일러 버그 보고는 [Visual Studio의 Report a Problem…](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
```

* XBOX 툴링은 디버깅 심볼로 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
```

* vcpkg Package Manager MSBuild 통합은 라이브러리 파일 이름에 와일드카드를 사용하므로 `lld-link`와 제대로 작동하지 않습니다. vcxproj에서 `<UseLldLink>false</UseLldLink>`를 설정하여 이 문제를 우회할 수 있습니다. 이 문제는 VS 프로젝트 생성기를 사용하는 vcpkg CMake 통합에는 영향을 주지 않습니다.

* XBOX용으로 clang v18을 C++20 모드에서 빌드할 때 템플릿 평가 변경으로 인해 WRL 헤더를 사용할 때 두 개의 심볼이 정의되지 않습니다.

```
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 사용하기](/ko/tools/tools-pc/visualstudio/gr-vs-clang.md)
- [XBOX 콘솔용 타이틀 패키징 시작하기](/ko/build/core-features/common/packaging/overviews/packaging-getting-started-for-console.md)
- [콘솔 개발을 위한 Visual Studio](/ko/tools/tools-console/visualstudio/visualstudio.md)
- [Visual Studio 2019 GDK 지원 정보](/ko/tools/tools-console/visualstudio/vs-2019-support-notes.md)
- [Visual Studio (목차)](/ko/tools/tools-pc/visualstudio/gr-visualstudio-toc.md)
