코드를 유니버설 CRT로 업그레이드

Microsoft C 런타임 라이브러리(CRT)는 Visual Studio 2015에서 리팩터링되었습니다. 표준 C 라이브러리, POSIX 확장 및 Microsoft 전용 함수, 매크로, 전역 변수가 새로운 라이브러리인 유니버설 CRT 또는 UCRT(유니버설 C 런타임 라이브러리)로 이동되었습니다. CRT의 컴파일러별 구성 요소가 새 vcruntime 라이브러리로 이동되었습니다.

UCRT는 이제 Windows 구성 요소이며 Windows 10 이상의 일부로 제공됩니다. UCRT는 C 호출 규칙에 기반을 둔 안정적인 ABI를 지원하고 몇 가지 예외를 제외하고 ISO C99 표준을 철저히 준수합니다. 더 이상 특정 버전의 컴파일러에 연결되지 않습니다. Visual Studio 2015 또는 Visual Studio 2017에서 지원하는 Windows 버전에서 UCRT를 사용할 수 있습니다. 이 방법은 Visual Studio를 업그레이드할 때마다 새 CRT 버전을 대상으로 지정하도록 더 이상 빌드를 업데이트할 필요가 없다는 장점이 있습니다.

이 리팩터링으로 인해 많은 CRT 헤더 파일, 라이브러리 파일 및 재배포 가능 파일의 이름이나 위치와 코드에 필요한 배포 방법이 변경되었습니다. UCRT의 많은 함수와 매크로도 표준 규칙 향상을 위해 추가되거나 변경되었습니다. 이러한 변경 내용을 활용하려면 기존 코드 및 프로젝트 빌드 시스템을 업데이트해야 합니다.

유니버설 CRT 파일의 위치

Windows 구성 요소인 UCRT 라이브러리 파일 및 헤더는 이제 Windows SDK(소프트웨어 개발 키트)에 포함됩니다. Visual Studio를 설치하면 UCRT를 사용하는 데 필요한 Windows SDK 부분도 설치됩니다. Visual Studio 설치 관리자는 UCRT 헤더, 라이브러리 및 DLL 파일의 위치를 Visual Studio 프로젝트 빌드 시스템에 사용되는 기본 경로에 추가합니다. Visual Studio C++ 프로젝트를 업데이트할 때 기본 프로젝트 설정을 사용하는 경우 IDE는 헤더 파일의 새 위치를 자동으로 찾습니다. 또한 링커는 새 기본 UCRT 및 vcruntime 라이브러리를 자동으로 사용합니다. 마찬가지로 개발자 명령 프롬프트를 사용하여 명령줄 빌드를 실행하면 헤더 및 라이브러리의 경로가 포함된 환경 변수가 업데이트되고 자동으로 작동합니다.

표준 C 라이브러리 헤더 파일은 이제 SDK 버전별 디렉터리에 있는 include 폴더의 Windows SDK에서 찾을 수 있습니다. 헤더 파일의 일반적인 위치는 Windows 버전 또는 업데이트(예: Windows 10 1주년 업데이트 10.0.14393.0)에 해당하는 프로그램 파일 또는 프로그램 파일(x86) 디렉터리에 Windows Kits\10\Include\[sdk-version]\ucrt[sdk-version] 있습니다.

UCRT 정적 라이브러리 및 동적 링크 스텁 라이브러리는 ARM64, x86 또는 X64 아래의 프로그램 파일 또는 프로그램 파일(x86) 디렉터리에 Windows Kits\10\Lib\[sdk-version]\ucrt\[architecture]architecture 있습니다. 정적 라이브러리 및 디버그 정적 라이브러리 libucrt.liblibucrtd.lib는 UCRT DLL에 대한 라이브러리와 ucrtd.lib같습니다ucrt.lib.

정품 및 디버그 UCRT DLL은 별도의 위치에 있습니다. 소매 DLL은 재배포 가능 파일이며 아래의 Program Files 또는 Program Files(x86) 디렉터리Windows Kits\10\Redist\ucrt\DLLs\[architecture]\에서 찾을 수 있습니다. UCRT 라이브러리 디버그는 재배포 가능 파일이 아니며 폴더 아래의 프로그램 파일 또는 프로그램 파일(x86) 디렉터리에서 찾을 수 Windows Kits\10\bin\[architecture]\ucrt 있습니다.

표준 라이브러리 및 헤더를 찾을 수 있는 위치

C 및 C++ 컴파일러별 런타임 지원 라이브러리 vcruntime에는 프로그램 시작 및 예외 처리 및 내장 함수와 같은 기능을 지원하는 데 필요한 코드가 포함되어 있습니다. 라이브러리 및 해당 헤더 파일은 여전히 프로그램 파일 또는 프로그램 파일(x86) 디렉터리의 버전별 Microsoft Visual Studio 폴더에 있습니다.

Visual Studio 2017, 2019 및 2022에서는 헤더 파일이 아래에 Microsoft Visual Studio\[year]\[edition]\VC\Tools\MSVC\[lib-version]\include있습니다. [year] 다음은 Visual Studio 버전이며 Visual [edition] Studio의 버전 또는 애칭이며 [lib-version] 라이브러리의 빌드 버전입니다.

링크 라이브러리는 Visual Studio 버전, [year] Visual Studio의 버전 또는 애칭, [lib-version][edition] 라이브러리의 빌드 버전 및 [architecture] 대상 프로세서 아키텍처에서 찾을 Microsoft Visual Studio\[year]\[edition]\VC\Tools\MSVC\[lib-version]\lib\[architecture]수 있습니다. OneCore 및 Store에 대한 링크 라이브러리는 libraries 폴더에도 있습니다.

정적 라이브러리의 정적 및 디버그 버전은 다음과 같습니다 libvcruntime.liblibvcruntimed.lib. 동적 링크 소매 및 디버그 스텁 라이브러리는 vcruntime.lib 각각과 vcruntimed.lib같습니다.

Visual Studio C++ 프로젝트를 업데이트할 때 프로젝트의 링커 속성을 모든 기본 라이브러리무시를 예로 설정했거나 명령줄에서 링커 옵션을 사용하는 /NODEFAULTLIB 경우 리팩터링된 새 라이브러리를 포함하도록 라이브러리 목록을 업데이트해야 합니다. 이전 CRT 라이브러리(예: libcmt.lib, libcmtd.lib또는 msvcrt.libmsvcrtd.lib)를 해당하는 리팩터링된 라이브러리로 바꿉다. 사용할 특정 라이브러리에 대한 자세한 내용은 CRT 라이브러리 기능을 참조 하세요.

유니버설 CRT의 배포 및 재배포

UCRT는 이제 Microsoft Windows 운영 체제 구성 요소이므로 Windows 10 이상에서 운영 체제의 일부로 포함됩니다. 이전 운영 체제, Windows Vista에서 Windows 8.1까지 Windows 업데이트 통해 사용할 수 있습니다. 재배포 가능 버전은 Windows XP에서 사용할 수 있습니다. 운영 체제 구성 요소로서 UCRT의 업데이트 및 서비스는 Visual Studio 및 Microsoft C++ 컴파일러 버전과는 별개로 Windows 업데이트를 통해 관리됩니다. UCRT는 Windows 구성 요소이므로 보안 및 업데이트의 용이성 및 이미지 크기가 더 작기 때문에 재배포 가능 패키지를 사용하여 앱에 대한 UCRT의 중앙 배포를 수행하는 것이 좋습니다.

Visual Studio 2015 이상에서 지원하는 모든 버전의 Windows에서 UCRT를 사용할 수 있습니다. Windows 10 이전의 지원되는 Windows 버전에 대한 패키지를 사용하여 vcredist 재배포할 수 있습니다. 패키지에는 vcredist UCRT 구성 요소가 포함되어 있으며 기본적으로 설치되지 않은 Windows 운영 체제에 자동으로 설치됩니다. 자세한 내용은 Visual C++ 파일 재배포를 참조하세요.

UCRT의 app-local 배포가 지원되지만 성능 및 보안상의 이유로 권장되지 않습니다. UCRT의 앱-로컬 배포를 위한 DLL은 하위 디렉터리 아래에 Windows SDK의 redist 일부로 포함됩니다. 필요한 DLL에는 포함 ucrtbase.dll 되며 이름이 APISet api-ms-win-[subset].dll전달자 DLL 집합입니다. 각 운영 체제에서 필요한 DLL 집합은 다르므로 app-local 배포를 사용할 경우 모든 DLL을 포함하는 것이 좋습니다. 앱-로컬 배포에 대한 자세한 내용 및 권장 사항은 Visual C++의 배포를 참조 하세요.

유니버설 CRT 함수 및 매크로에 대한 변경 내용

ISO C99 준수를 향상하고 코드 품질 및 보안 문제를 해결하기 위해 UCRT에서 많은 함수가 추가되거나 업데이트되었습니다. 경우에 따라 이를 위해 라이브러리에 대한 상당한 변경이 필요했습니다. 이전 버전의 CRT를 사용할 때 클린 컴파일된 코드는 UCRT를 사용하여 컴파일할 때 중단될 수 있습니다. 그렇다면 UCRT 업데이트 및 기능을 활용하려면 코드를 변경해야 합니다. 유니버설 CRT에 있는 CRT에 대한 주요 변경 내용 및 업데이트의 전체 목록은 Visual C++ 변경 기록의 CRT(C 런타임 라이브러리) 섹션을 참조하세요. 여기에는 코드에서 필요한 변경 내용을 식별하는 데 사용할 수 있는 영향 받는 헤더 및 함수 목록이 포함됩니다.

참고 항목

Visual C++ 이식 및 업그레이드 가이드
잠재적인 업그레이드 문제 개요(Visual C++)
이전 버전의 Visual C++에서 프로젝트 업그레이드
Visual C++ 변경 기록 2003 - 2015
Visual Studio의 C++ 규칙 향상