필요한 Visual Studio 버전 및 구성 요소
Microsoft Game Development Kit (GDK)에서 Clang/LLVM을 사용하려면 Visual Studio 버전 16.11 이상이 필요합니다. Visual Studio 2019 설치 시 C++를 사용한 데스크톱 개발 아래의 Windows용 C++ Clang 도구 구성 요소를 선택해야 합니다. 사용하는 Visual Studio 버전에 따라 필요한 Clang/LLVM 구성 요소의 이름이 Windows용 C++ Clang 컴파일러 및 **C++ Clang-cl for v142 build tools (x64/x86)**일 수 있습니다.Microsoft Game Development Kit (GDK)가 설치된 후 기존 Visual Studio 설치를 수정하여 Windows용 C++ Clang 도구를 추가한 경우, Clang/LLVM을 사용하기 전에 Microsoft Game Development Kit (GDK) 설치를 복구해야 합니다.
Gaming.Desktop.x64 플랫폼용 ClangCl 플랫폼 도구 집합에 대한 지원을 설치합니다.
컴파일러 및 링커 스위치
Gaming.Desktop.x64 플랫폼의 경우 clang-cl.exe와 함께 사용되는 clang/LLVM 명령줄에는 항상 다음이 포함됩니다.
지원되는 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에서 수정되었습니다.
msbuild와 함께 Clang/LLVM 사용
msbuild 프로젝트에서 Clang/LLVM을 사용하려면 플랫폼 도구 집합을 “LLVM (clang-cl)“로 설정하세요. 플랫폼 도구 집합은 다음 그림과 같이 Visual C++ 프로젝트 속성 대화 상자의 일반 탭 아래에서 찾을 수 있습니다. Clang/LLVM 도구 집합은 다음 예제와 같이 PlatformToolset msbuild 속성을 ClangCl로 직접 설정하여 설정할 수도 있습니다.cmake와 함께 Clang/LLVM 사용
CMakeExample 및 CMakeGDKExample Microsoft Game Development Kit (GDK) 샘플은 Clang/LLVM을 cmake 프로젝트에 통합하기 위한 좋은 시작점을 제공합니다. 다운로드 지침은 Microsoft Game Development Kit (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을 활성화하려면 다음 단계를 사용하세요.- Visual Studio의 로컬 폴더 열기 옵션을 사용하여 루트 CMakeExample 폴더의 Desktop 폴더를 엽니다.
CMakeSettings.json 솔루션 대신 CMakePresets.json을 사용하도록 업데이트되었습니다. CMake 사전 설정은 Visual Studio 2019 16.10 이상과 통합되어 있습니다. 이 블로그 게시물을 참조하세요.
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-Desktop-Clang사전 설정을 선택합니다.
CMakeSettings.json 통합
- 솔루션 탐색기에서 CMakeSettings.json 파일을 두 번 클릭합니다.
- 편집하려는 구성을 선택하고 Toolset 값을 “clang_cl_x64”로 설정합니다. 저장하고 닫습니다.
- XBOX One 및 XBOX Series X|S 구성의 경우 Edit Json을 선택하고 XdkEditionTarget 변수가 GDK 에디션 및 QFE 수준과 일치하는지 확인합니다.
- 구성 드롭다운에서 원하는 값을 선택하고 빌드 메뉴에서 모두 다시 빌드를 선택합니다.
- 파일 -> 열기 -> 프로젝트/솔루션을 사용하여 생성된 솔루션/프로젝트를 선택합니다. 예:
지원 받기
Visual C++ 컴파일러 버그 신고는 Visual Studio의 문제 보고…를 사용하세요. clang/LLVM 컴파일러 버그 신고는 https://bugs.llvm.org/를 사용하세요. Microsoft Standard C++ Library(즉, STL) 버그 신고는 https://github.com/microsoft/STL/issues를 사용하세요.알려진 문제
- Clang/LLVM 도구 집합은 특히 -Wall -Wextra -Wpedantic을 사용할 때 Visual C++보다 훨씬 더 자세한 출력을 제공합니다. 최소한 명령줄이나 #pragma로 다음 경고를 억제하세요.
- 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링커는 이러한 라이브러리를 사용할 때 항상 무해한 경고를 방출합니다.
