> ## 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++를 사용한 데스크톱 개발** 아래의 **Windows용 C++ Clang 도구** 구성 요소를 선택해야 합니다.

<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="Windows용 Clang 도구" width="630" height="378" data-path="images/gdk/tools/vs_clang_install_options.png" />

사용하는 Visual Studio 버전에 따라 필요한 Clang/LLVM 구성 요소의 이름이 **Windows용 C++ Clang 컴파일러** 및 \*\*C++ Clang-cl for v142 build tools (x64/x86)\*\*일 수 있습니다.

<Note>Microsoft Game Development Kit (GDK)가 설치된 후 기존 Visual Studio 설치를 수정하여 **Windows용 C++ Clang 도구**를 추가한 경우, Clang/LLVM을 사용하기 전에 Microsoft Game Development Kit (GDK) 설치를 복구해야 합니다.</Note>

**Windows용 C++ Clang 도구** 구성 요소가 설치된 경우, 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에서 지원된다고 확신할 수 있습니다. Windows 10에서 지원하는 모든 최신 CPU에서 지원되므로 SSE3도 안전하게 요구할 수 있습니다. DirectXMath의 경우 이는 전처리기 정의 `_XM_SSE3_INTRINSICS_`를 정의하고 `-march=sse3`를 사용하여 clang/LLVM으로 빌드해야 한다는 것을 의미합니다.

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 도구 집합은 다음 예제와 같이 **PlatformToolset** msbuild 속성을 **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) 샘플은 Clang/LLVM을 cmake 프로젝트에 통합하기 위한 좋은 시작점을 제공합니다. 다운로드 지침은 [Microsoft Game Development Kit (GDK) 샘플](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/development-downloads/gdk-samples-home)을 참조하세요.

<Note>cmake 프로젝트에 Clang/LLVM 지원을 추가하기 전에 **Windows용 C++ CMake 도구** Visual Studio 구성 요소가 설치되어 있는지 확인하세요. 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 구성에 붙여넣습니다. XDKEditionTarget 값을 QFE 수준을 포함한 GDK 버전에 적합한 값으로 설정합니다.

```
"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 값을 &#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의 문제 보고…](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
```

* Microsoft Game Development Kit (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
```

## 함께 보기

[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 사용하기](/ko/tools/tools-console/visualstudio/vs-clang.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)
- [Visual Studio](/ko/tools/tools-pc/visualstudio/index.md)
