필요한 Visual Studio 버전 및 구성 요소
GDK에서 Clang/LLVM을 사용하려면 Visual Studio 버전 16.11 이상이 필요합니다. Visual Studio를 설치할 때 개별 구성 요소에서 C++ Clang Compiler for Windows 구성 요소를 선택하세요. 사용 중인 Visual Studio 버전에 따라 필요한 Clang/LLVM 구성 요소의 이름이 C++ Clang Compiler for Windows 및 **C++ Clang-cl for v142 build tools (x64/x86)**일 수 있습니다.GDK 설치 후 기존 Visual Studio 설치를 수정하여 C++ Clang Compiler for Windows를 추가한 경우 Clang/LLVM을 사용하기 전에 GDK 설치를 복구해야 합니다.
Gaming.Xbox.*.x64 플랫폼에 대해 ClangCl 플랫폼 도구 세트 지원을 설치합니다.
컴파일러 및 링커 스위치
Gaming.Xbox.*.x64 플랫폼의 경우 clang-cl.exe와 함께 사용되는 clang/LLVM 명령줄에는 항상 다음이 포함됩니다.
Gaming.Xbox.Scarlett.x64의 경우 -march=znver2도 추가됩니다. 이 스위치는 AVX2와 Hercules CPU 특화 기능 몇 가지를 설정합니다.
Gaming.Xbox.XboxOne.x64의 경우 -march=btver2도 추가됩니다. 이 스위치는 AVX, F16C 및 Jaguar CPU 특화 기능 몇 가지를 설정합니다.
GDK 개발에 권장되는 스위치에 대한 자세한 내용은 Visual C++ 컴파일러 및 링커 스위치 권장 사항을 참조하세요.
지원되는 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에서 수정되었습니다.
msbuild에서 Clang/LLVM 사용
msbuild 프로젝트에서 Clang/LLVM을 사용하려면 Platform Toolset을 “LLVM (clang-cl)“로 설정합니다. 다음 그림과 같이 Visual C++ 프로젝트 속성 대화 상자의 일반 탭에서 Platform Toolset을 찾을 수 있습니다. 다음 예제와 같이 PlatformToolset msbuild 속성을 ClangCl로 직접 설정하여 Clang/LLVM 도구 세트를 설정할 수도 있습니다.-W#pragma-messages 출력이 경고로 표시되고 -Wunused-value 경고도 표시됩니다.
cmake에서 Clang/LLVM 사용
CMakeExample 및 CMakeGDKExample GDK 샘플은 Clang/LLVM을 cmake 프로젝트에 통합하는 좋은 출발점을 제공합니다. 이러한 샘플은 XBOX Developer Downloads 페이지에서 다운로드할 수 있습니다.cmake 프로젝트에 Clang/LLVM 지원을 추가하기 전에 C++ CMake tools for Windows Visual Studio 구성 요소가 설치되어 있는지 확인하세요. Visual Studio 2019 (16.11)는 CMake 3.20과 함께 제공됩니다. Visual Studio 2022는 CMake 3.21 이상과 함께 제공됩니다.
CMakeExample 사용
CMakeExample 프로젝트에서 Clang/LLVM을 활성화하려면 다음 단계를 따르세요. CMakeExample은 2022년 3월에 기존CMakeSettings.json 솔루션 대신 CMakePresets.json을 사용하도록 업데이트되었습니다. CMake Presets은 Visual Studio 2019 16.10 이상과 통합됩니다. 이 블로그 게시물을 참조하세요.
- Visual Studio의 로컬 폴더 열기 옵션을 사용하여 CMakeExample 루트 폴더의 Desktop, XBOX Series X|S 또는 XboxOne 폴더를 엽니다.
CMakePresets.json 통합
- 솔루션 탐색기에서 CMakePresets.json 파일을 두 번 클릭합니다.
XdkEditionTarget 변수를 현재 GDK 에디션과 일치하도록 편집합니다.
x64-Debug-Clang또는x64-Release-Clang프리셋을 선택합니다.
CMakeSettings.json 통합
- 솔루션 탐색기에서 CMakeSettings.json 파일을 두 번 클릭합니다.
- PLUS 아이콘을 선택하고 다음 그림과 같이 x64-Clang-Debug 및 x64-Clang-Release를 선택합니다. 변경 사항을 저장합니다.
- Edit Json을 선택한 다음, 다음 예제와 같이 다른 구성의 variables 섹션을 잘라 새 Clang 구성에 붙여넣습니다.
XDKEditionTarget값을 QFE 수준을 포함하여 사용 중인 GDK 버전에 적합한 값으로 설정합니다.
- 모든 변경 사항을 저장한 후 빌드 구성 드롭다운에서 x64-Clang-Debug 또는 x64-Clang-Release를 선택하고 빌드합니다.
CMakeGDKExample 사용
CMakeGDKExample 프로젝트에서 Clang/LLVM을 활성화하려면 다음 단계를 따르세요.- Visual Studio의 로컬 폴더 열기 옵션을 사용하여 CMakeGDKExample 폴더를 엽니다.
CMakePresets.json 통합
- 솔루션 탐색기에서 CMakePresets.json 파일을 두 번 클릭합니다.
XdkEditionTarget 변수를 현재 GDK 에디션과 일치하도록 편집합니다.
x64-Scarlett-Clang또는x64-XboxOne-Clang프리셋을 선택합니다.
CMakeSettings.json 통합
- 솔루션 탐색기에서 CMakeSettings.json 파일을 두 번 클릭합니다.
-
편집할 구성을 선택합니다. Toolset 값을
clang_cl_x64로 설정합니다. 저장하고 닫습니다.
-
XBOX One 및 XBOX Series X|S 구성의 경우 Edit Json을 선택하고
XdkEditionTarget변수가 GDK 에디션과 QFE 수준과 일치하는지 확인합니다. - 구성 드롭다운에서 원하는 값을 선택하고 빌드 메뉴에서 모두 다시 빌드를 선택합니다.
- 파일 -> 열기 -> 프로젝트/솔루션을 사용하여 생성된 솔루션과 프로젝트를 선택합니다. 예:
지원 받기
Visual C++ 컴파일러 버그 보고는 Visual Studio의 Report a Problem…을 사용하세요. clang/LLVM 컴파일러 버그 보고는 https://bugs.llvm.org/를 사용하세요. Microsoft Standard C++ Library(STL이라고도 함) 버그 보고는 https://github.com/microsoft/STL/issues를 사용하세요.알려진 문제
- Clang/LLVM 도구 세트는 Visual C++보다 훨씬 자세한 출력을 생성하며, 특히
-Wall -Wextra -Wpedantic을 사용할 때 그렇습니다. 최소한 다음 경고를 명령줄이나#pragma로 억제하세요.
-
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링커는 이러한 라이브러리를 사용할 때 항상 무해한 경고를 방출합니다.
-
vcpkg Package Manager MSBuild 통합은 라이브러리 파일 이름에 와일드카드를 사용하므로
lld-link와 제대로 작동하지 않습니다. vcxproj에서<UseLldLink>false</UseLldLink>를 설정하여 이 문제를 우회할 수 있습니다. 이 문제는 VS 프로젝트 생성기를 사용하는 vcpkg CMake 통합에는 영향을 주지 않습니다. - XBOX용으로 clang v18을 C++20 모드에서 빌드할 때 템플릿 평가 변경으로 인해 WRL 헤더를 사용할 때 두 개의 심볼이 정의되지 않습니다.
