원문 : Introducing the Universal CRT

주의 : 번역이 개판이므로 이상하면 원문을 참조하세요.


 

작년 6월에 우리는 한 쌍의 기사들을 발표했는데, 그것은 Visual Studio 2010 에서 Visual C++ C Runtime( CRT ) 에 대해 수행된 큰 변화에 대해서 다뤘습니다. "The Great C Runtime (CRT) Refactoring" 에서, 우리는 CRT 에 대해 수행한 중요한 구조적 변화를 설명했습니다. 그리고 "C Runtime (CRT) Features, Fixes, and Breaking Changes in Visual Studio 14 CTP1" 에서, 우리는 기존에 구현해온 중요한 기능들과 우리가 만들어 온 행동 변화들을 모두 애뮬레이트했습니다.

 

우리는 그 기사들을 작성하고 Visual Studio 2015 의 첫 번째 Community Technology Preview (CTP) 를 릴리스한 이후로 몇 개월 동안 여러분으로부터 많은 피드백을 받아 왔습니다. 우리는 특히 Microsoft Connect 에 여러분이 제출해 준 많은 탁월한 버그들에 대해서 감사드립니다. 첫 번째 CTP 이후로 CRT 에 많은 변화를 주지는 않았지만, 우리는 여러분의 피드백을 다루고, 좀 더 나은 결과를 이루고, 일부 오래 걸리는 프로젝트들을 마무리하기 위해 많은 일들을 해 왔습니다. 가장 최근에 릴리스된 Visual Studio 2015 CTP6 는 우리가 작업해 온 이러한 모든 개선점들을 포함합니다. 우리는 또 다시 한 쌍의 기사들에서 이러한 변화들에 대해서 다룰 계획입니다: 이 기사는 첫 번째 CTP 이후로의 중요한 구조적 변화들에 대해서 다룹니다; 다음 기사에서는 새로운 기능들, 버그 픽스들, 그리고 변화에 대한 세부사항을 모두 애뮬레이트할 계획입니다.

 

지난 6월의 기사들에서, 우리는 CRT 가 두 개의 논리 파트들로 나뉜 방식에 대해서 설명했습니다: VCRuntime 은 프로세스 시작과 예외 처리와 같은 것들을 위해서 요구되는 기능성들을 지원하는 컴파일러를 포함하고, "stable" 파트는 CRT 의 순수한 라이브러리 파트들을 포함합니다. 여기에서 우리는, Visual Studio 의 주요 버전과 함께 새롭게 버전이 설정되는 DLL 들을 릴리스하기 보다는, 앞으로는 in-place 로 서비스를 할 것입니다. 이 시점에 이 "stable" 파트는 두 개의 라이브러리 형태를 취했었습니다: AppCRT 와 DesktopCRT( 릴리스 DLL 들의 이름은 appcrt140.dll 과 desktopcrt140.dll 이었습니다 ).

 

VCRuntime 은 여전히 같은 형태로 존재하며, 기존의 CTP 들에서와 동일한 내용을 가지고 있습니다. 이 마지막 CTP6 에서 우리가 만든 중요한 변화들은 "stable" 파트 내부에 존재합니다. AppCRT 와 DesktopCRT 는 하나의 라이브러리로 다시 합쳐졌는데, 이는 Universal CRT 라 불립니다. 새로운 DLL 들은 ucrtbase.dll( 릴리스 ) 와 ucrtbased.dll( 디버그 ) 입니다; 그것들은 버전 넘버를 가지고 있지 않습니다. 왜냐하면 in-place 로 서비스될 것이기 때문입니다.

 

Universal CRT 는 윈도우즈 운영 체제의 요소입니다. 이것은 January Technical Preview 의 시작과 함께 Windows 10 의 일부로 포함되어 있으며, 윈도우즈 업데이트를 통해서 이전 버전의 운영 체제에서도 이용할 수 있습니다.

 

Universal CRT 를 사용하여 소프트웨어 빌드


이전에는 CRT 의 모든 헤더, 소스, 라이브러리가 Visual C++ SDK 의 일부로서 배포되었는데, 이는 Visual Studio 설치 디렉토리( 일반적으로 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC )의 VC 서브 디렉토리에 설치되었습니다. VCRuntime 을 위한 파일들은 여전히 Visual C++ SDK 의 일부로 존재합니다. 헤더, 소스, 라이브러리는 이제 개별적인 Universal CRT SDK 의 일부로 배포됩니다. 이 SDK 는 Visual Studio 에 포함되어 있습니다; 이는 기본적으로 C:\Program Files (x86)\Windows Kits\10 에 설치됩니다. 디버그용 ucrtbased.dll 은 여전히 이 SDK 의 일부로 포함되며, 시스템 디렉토리에 설치됩니다.

 

우리는 Visual C++ MSBuild props 및 targets 파일들을 업데이트하여 새로운 Universal CRT 디렉토리들을 include 및 library 경로에 추가했습니다. 만약 Visual Studio 2015 로 프로젝트를 생성하거나 Visual Studio 2015 로 현존하는 프로젝트를 업그레이드한다면, 그것은 이러한 새로운 디렉토리들을 자동으로 선택할 것입니다. 만약 Visual C++ MSBuild props 및 targets 를 사용하지 않거나 기본 include 및 library 경로를 그런 props 및 targets 파일에서 상속하지 않는 프로젝트를 업그레이드한다면, 여러분은 그 새 디렉토리들을 수동으로 업데이트해 줄 필요가 있습니다. 여러분은 Universal CRT SDK 파일들을 찾기 위해서 다음과 같은 MSBuild 속성들을 사용할 수 있습니다.

 

$(UniversalCRT_IncludePath)
$(UniversalCRT_LibraryPath_x86)
$(UniversalCRT_LibraryPath_x64)
$(UniversalCRT_LibraryPath_arm)

 

그러므로 여러분이 /nodefaultlib 옵션을 사용해 링크하지 않는 이상, 모든 correct 라이브러리 파일들은 여러분이 프로젝트를 링크할 때 검색될 것입니다. 만약 /nodefaultlib 옵션을 사용해서 링크한다면, 여러분은 링크를 할 때 몇 개의 추가적인 라이브러리들을 링크할 필요가 있을 것입니다. 예를 들어, 이전에는 CRT DLL 을 사용하기 위해서 msvcrt.lib 를 가지고 있었다면, 이제는 vcruntime.lib 와 ucrt.lib 도 링크할 필요가 있습니다. 아래 테이블에서는 어떠한 라이브러리가 이전의 라이브러리에 대응해 링크되어야 하는지를 보여 줍니다.

 

 Release DLLs  (/MD  ) :

 msvcrt.lib

 vcruntime.lib

 ucrt.lib

 Debug DLLs    (/MDd) :

 msvcrtd.lib

 vcruntimed.lib

 ucrtd.lib

 Release Static (/MT  ) :

 libcmt.lib

 libvcruntime.lib

 libucrt.lib

 Debug Static    (/MTd) :

 libcmtd.lib

 libvcruntimed.lib

 libucrtd.lib

 

Universal CRT 를 사용하는 소프트웨어 배포하기


과거에는, "Deployment in Visual C++" 에서 설명된 많은 방식 중 하나를 사용해서 Visual C++ 라이브러리들을 소프트웨어와 함께 배포해 왔을 것입니다. Universal CRT 를 제외한 모든 Visual C++ 라이브러리들에 대해, 배포 방식에서의 변화는 있을 수 없습니다. 배포 모드가 무엇이든 간에( central, local or static linking ) 이전 방식이 여전히 사용될 수 있습니다.

 

그러나 위에서 언급했듯이 Universal CRT 가 윈도우즈 운영 체제로 이동했기 때문에, 약간의 주목해야할 변화들이 존재합니다:

 

  1. Universal CRT 는 윈도우즈 운영 체제 요소입니다. 이는 윈도우즈 10 의 일부입니다. Windows 10 보다 앞선 버전의 윈도우에 대해서도, 윈도우즈 업데이트를 통해서 Universal CRT 가 배포될 수 있습니다. 윈도우즈 Vista 부터 Windows 8.1 까지를 위한 윈도우즈 업데이트 MSU 패키지들이 있습니다. 현재 MSU 패키지들은 VCRedist 설치의 일부로서 설치됩니다. 이후의 Visual Studio 2015 빌드에서는, 이러한 MSU 패키지들이 Universal CRT SDK 의 일부로서 개별적으로 배포될 계획이며, 다운로드를 위해서 support.microsoft.com 을 이용할 계획입니다.
  2. 만약 Universal CRT 가 설치되어 있지 않은 윈도우즈 운영 체제( 즉 윈도우즈 8.1 이전 )에서 사용되도록 설계된 소프트웨어를 빌드했다면, 여러분의 소프트웨어는 Universal CRT 를 설치하기 위해서 위에서 언급했던 윈도우즈 업데이트 패키지에 의존해야할 필요가 있을 것입니다.
  3.  만약 현재 VCRedist( 우리의 재배포 패키지 파일들 ) 를 사용하고 있다면, 기존에 그랬던 것처럼 잘 동작할 것입니다. Visual Studio 2015 VCRedist 패키지는 위에서 언급했던 윈도우즈 업데이트 패키지를 포함하고 있어서, 단순히 VCRedist 를 설치하는 것만으로도 Visual C++ 라이브러리들과 Universal CRT 를 설치할 것입니다. 이는 우리가 추천하는 배포 메커니즘입니다. 윈도우즈 XP 에 대해서는 Universal CRT 윈도우즈 업데이트 MSU 가 존재하지 않으므로, VCRedist 가 Universal CRT 자체를 배포할 것입니다.
  4. 만약 현재 Visual C++ 라이브러리들을 정적으로 링크하고 있다면, 기존에 그랬던 것과 같이 잘 동작할 것입니다. 우리는 성능 및 서비스 유용성을 이유로 Visual C++ 라이브러리들에 대한 정적 링크를 강력하게 권장하고 있습니다. but we recognize that there are some use cases that require static libraries and we will continue to support the static libraries for those reasons.
  5. Universal CRT 에 대한 머지( merge ) 모듈은 존재하지 않을 것입니다. 만약 현재 CRT 머지 모듈을 사용하고 있고, 여전히 Visual C++ 라이브러리들을 중앙에서 배포하기를 원한다면, 우리는 여러분이 위에서 언급된 윈도우즈 업데이트 패키지나 VCRedist 로 이동할 것을 권장합니다. 대안적으로, 여러분은 Universal CRT 와 Visual C++ 라이브러리를 정적으로 링크하는 선택을 할 수도 있습니다.
  6. Universal CRT 에 대한 app-local 배포가 지원됩니다. app-local 배포를 위한 바이너리를 획득하고자 한다면, Windows Software Development Kit (SDK) for Windows 10 을 설치하십시오. 이 바이너리들은 C:\Program Fiels (x86)\Windows Kits\10\Redist\ucrt 에 설치될 것입니다. 여러분은 모든 DLL 들을 당신의 app 에 복사할 필요가 있습니다( DLL 집합은 서로 다른 버전의 윈도우즈에 대해서 다릅니다. 그러므로 지원되는 모든 버전의 윈도우에서 프로그램이 실행되도록 하기 위해서는 모든 DLL 들을 포함시켜야만 합니다 ).

이전에 언급했던 것처럼, 우리는 리팩토링된 CRT 를 CTP1 에서 소개한 이후로 많은 버그를 해결하고 기능을 개선해 왔습니다. 이번 주 후반에는 이러한 변경들에 대해서 더 세부적으로 다루는 두 번째 기사를 작성할 계획입니다. 그 동안에, 우리는 새로운 Universal CRT 에 대한 여러분의 피드백을 기대하도록 하겠습니다.

 

James McNellis and Raman Sharma

Visual C++ Libraries

+ Recent posts