다음을 통해 공유


Microsoft 게임 개발 키트(GDK)에서 Clang/LLVM 사용

Clang/LLVM을 사용하는 GDK 타이틀 개발은 Visual Studio 2019 또는 2022 및 Windows용 clang/LLVM 도구 집합 v12 이상을 사용하여 공식적으로 지원됩니다. 이 도구 집합은 Visual C/C++ 런타임(Universal CRT 라이브러리 + Microsoft STL)을 사용합니다. 다른 도구 집합과 런타임 조합은 타이틀 인증을 실행하거나 통과하지 못할 수 있습니다.

LLVM(clang-cl)을 사용하는 윈도우즈용 Clang/LLVM 플랫폼 도구 집합은 Microsoft Standard C++ 라이브러리를 사용합니다.

Clang 버전 Visual Studio 업데이트
Clang 버전 12 Visual Studio 2019 (16.11)
Clang 버전 12 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) 미리 보기

필요한 Visual Studio 버전 및 구성 요소

Microsoft GDK(게임 개발 키트)와 함께 Clang/LLVM을 사용하려면 Visual Studio 버전 16.11 이상이 필요합니다. Visual Studio 2019를 설치할 때는 데스크톱 개발(C++ 포함) 아래의 ClangWindows용 C++ Clang 도구 구성 요소를 선택해야 합니다.

Windows용 Clang 도구

필요한 Clang/LLVM 구성 요소를 사용하고 있는 Visual Studio 버전에 따라 Windows용 C++ Clang 컴파일러v142 빌드 도구(x64/x86)용 C++ Clang-cl의 이름이 지정될 수 있습니다.

참고 항목

Microsoft GDK(게임 개발 키트)가 설치된 후 기존 Visual Studio 설치를 수정하여 Windows용 C++ Clang Tools를 추가하는 경우 Clang/LLVM을 사용하기 전에 Microsoft GDK(게임 개발 키트) 설치를 복구해야 합니다.

C++ Windows용 Clang 도구 구성 요소가 설치된 경우 Microsoft 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 컴파일러와 다르게 처리합니다. 특히 __m128, __m128i, __m128d 유형은 구조체가 아닌 불투명한 유형으로 간주되므로 이러한 유형을 사용하여 C++ 오버로드 함수를 만들 수 없습니다. 이는 또한 __m128.m128_f32[]를 통한 직접적인 요소 액세스가 clang에서 컴파일되지 않음을 의미합니다.

Clang/LLVM의 DirectXMath에서는 이로 인해 모든 XMVECTOR C++ 오버로드가 사용되지 않도록 설정됩니다. 또한 DirectXMath 헤더를 포함하기 전에 전 처리기 기호 XM_NO_XMVECTOR_OVERLOADS를 정의하여 더 나은 이동성을 위해 Visual C++에서 이 동작에 옵트인할 수 있습니다.

PC의 경우 아키텍처 정의의 일부이므로 모든 x64 기본 CPU에서 지원되는 SSE 및 SSE2를 기대할 수 있습니다. 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는 잘못된 CPUID 내장 함수를 사용하여 Clang/LLVM에 XMVerifyCPUSupport을 구현했습니다. 이는 Windows 10 SDK(19041) 이상의 DirectXMath 3.14에 대해 수정되었습니다.

msbuild로 Clang/LLVM 사용

msbuild 프로젝트에서 Clang/LLVM을 사용하려면 플랫폼 도구 세트를 "LLVM(clang-cl)"으로 설정합니다. 플랫폼 도구 세트는 다음 그림과 같이 Visual C++ 프로젝트 속성 대화 상자의 일반 탭에서 찾을 수 있습니다.

Clang/LLVM msbuild 속성

다음 예제와 같이 PlatformToolset msbuild 속성을 ClangCl로 직접 설정하여 Clang/LLVM 도구 집합을 설정할 수도 있습니다.


<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 게임 개발 키트(GDK) 샘플은 Clang/LLVM을 cmake 프로젝트에 통합하기 좋은 시작점을 제공합니다. 다운로드 지침은 Microsoft GDK(게임 개발 키트) 샘플을 참조하세요.

참고 항목

cmake 프로젝트에 Clang/LLVM 지원을 추가하기 전에 Windows용 C++ CMake 도구 Visual Studio 구성 요소인가 설치되어 있는지 확인합니다. Visual Studio 2019(16.11)는 CMake 3.20과 함께 제공됩니다. Visual Studio 2022는 CMake 3.21 이상과 함께 제공됩니다.

CMakeExample 사용

다음 단계를 사용하여 CMakeExample 프로젝트에서 Clang/LLVM을 활성화합니다.

  1. Visual Studio의 로컬 폴더 열기 옵션을 사용하여 루트 CMakeExample 폴더에서 Desktop 폴더를 엽니다.

CMakeExample은 이전 CMakeSettings.json 솔루션 대신 CMakePresets.json을 사용하도록 2022년 3월에 업데이트되었습니다. CMake 사전 설정은 Visual Studio 2019 16.10 이상과 통합됩니다. 이 블로그 게시물을 참조하세요.

CMakePresets.json 통합

  1. 솔루션 탐색기에서 CMakePresets.json 파일을 두 번 클릭합니다.

현재 GDK 버전과 일치하도록 XdkEditionTarget 변수를 편집합니다.

"cacheVariables": {
  "XdkEditionTarget": "230300",
  "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}"
}
  1. x64-Debug-Clang 또는 x64-Release-Clang 사전 설정을 선택합니다.

CMakeSettings.json 통합

  1. 솔루션 탐색기에서 CMakeSettings.json 파일을 두 번 클릭합니다.

  2. "PLUS"아이콘을 선택하고 다음 그림과 같이 "x64-Clang-Debug"및/또는 "x64-Clang-Release"를 선택합니다. 변경 사항을 저장하세요.

cmake 프로젝트에 Clang 구성 추가

  1. "Json 편집"을 클릭한 후 다음 예제와 같이 다른 구성의 변수 섹션을 잘라내어 새 Clang 구성에 붙여 넣습니다. XDKEditionTarget 값을 QFE 수준을 포함하여 GDK 버전에 적합한 값으로 설정합니다.
"variables": [
  {
    "name": "XdkEditionTarget",
    "value": "210400",
    "type": "STRING"
  }
]

  1. 모든 변경 사항을 저장한 후 빌드 구성 드롭 다운에서 x64-Clang-Debug 또는 x64-Clang-Release를 선택하고 빌드합니다.

CMakeGDKExample 사용

다음 단계에 따라 CMakeGDKExample 프로젝트에서 Clang/LLVM을 활성화합니다.

  1. Visual Studio의 로컬 폴더 열기 옵션을 사용하여 CMakeGDKExample 폴더를 엽니다.

CMakePresets.json 통합

  1. 솔루션 탐색기에서 CMakePresets.json 파일을 두 번 클릭합니다.

현재 GDK 버전과 일치하도록 XdkEditionTarget 변수를 편집합니다.

"cacheVariables": {
  "XdkEditionTarget": "230300",
  "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}"
}
  1. x64-Desktop-Clang 사전 설정을 선택합니다.

CMakeSettings.json 통합

  1. 솔루션 탐색기에서 CMakeSettings.json 파일을 두 번 클릭합니다.

  2. 편집할 구성을 선택하고 도구 세트 값을 "clang_cl_x64"로 설정합니다. 저장하고 닫습니다.

도구 집합 값을

  1. Xbox One 및 Xbox Series X|S 구성의 경우 Json 편집을 선택하고 XdkEditionTarget 변수가 GDK 버전 및 QFE 수준과 일치하는지 확인합니다.

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

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

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

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

지원 받기

Visual C++ 컴파일러에 대한 버그 보고의 경우 Visual Studio에서 문제 보고…를 사용합니다.

clang/LLVM 컴파일러에 대한 버그 보고의 경우 https://bugs.llvm.org/을(를) 사용합니다.

Microsoft Standard C++ 라이브러리(STL라고도 함)에 대한 버그 보고의 경우, 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 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

Clang/LLVM으로 CMake 사용

Clang/LLVM으로 MSBuild 사용