CRT 라이브러리 기능CRT Library Features

이 항목에서는 C 런타임 라이브러리 및 관련 컴파일러 옵션과 전처리기 지시문을 구성하는 다양한 .lib 파일에 대해 설명합니다.This topic discusses the various .lib files that comprise the C run-time libraries as well as their associated compiler options and preprocessor directives.

C 런타임 라이브러리(CRT)C Run-Time Libraries (CRT)

CRT(C 런타임) 라이브러리는 ISO C99 표준 라이브러리를 통합하는 C++ 표준 라이브러리의 일부입니다.The C Run-time Library (CRT) is the part of the C++ Standard Library that incorporates the ISO C99 standard library. CRT를 구현하는 Visual C++ 라이브러리는 네이티브 코드 개발, 혼합된 네이티브와 관리 코드 및 .NET 개발을 위한 순수 관리 코드를 지원합니다.The Visual C++ libraries that implement the CRT support native code development, and both mixed native and managed code, and pure managed code for .NET development. 모든 버전의 CRT는 다중스레드 개발을 지원합니다.All versions of the CRT support multi-threaded development. 대부분의 라이브러리는 라이브러리를 코드에 직접 연결하는 정적 연결이나 코드에서 공용 DLL 파일을 사용할 수 있도록 하는 동적 연결을 모두 지원합니다.Most of the libraries support both static linking, to link the library directly into your code, or dynamic linking to let your code use common DLL files.

Visual Studio 2015부터 CRT는 새로운 이진 파일로 리팩터링되었습니다.Starting in Visual Studio 2015, the CRT has been refactored into new binaries. UCRT(유니버설 CRT)에는 표준 C99 CRT 라이브러리에서 내보낸 전역 변수 및 함수가 포함됩니다.The Universal CRT (UCRT) contains the functions and globals exported by the standard C99 CRT library. UCRT는 이제 Windows 구성 요소이며 Windows 10의 일부로 제공됩니다.The UCRT is now a Windows component, and ships as part of Windows 10. 이제 정적 라이브러리, DLL 가져오기 라이브러리 및 UCRT에 대한 헤더 파일이 Windows 10 SDK에 있습니다.The static library, DLL import library, and header files for the UCRT are now found in the Windows 10 SDK. Visual C++를 설치하면 Visual Studio 설치에서 UCRT를 사용하는 데 필요한 Windows 10 SDK의 하위 집합을 설치합니다.When you install Visual C++, Visual Studio setup installs the subset of the Windows 10 SDK required to use the UCRT. Visual Studio 2015 이상 버전에서 지원하는 모든 Windows 버전에서 UCRT를 사용할 수 있습니다.You can use the UCRT on any version of Windows supported by Visual Studio 2015 and later versions. Windows 10이 아닌 지원되는 다른 버전의 Windows에 대해 vcredist를 사용하여 재배포할 수 있습니다.You can redistribute it using vcredist for supported versions of Windows other than Windows 10. 자세한 내용은 Redistributing Visual C++ Files을 참조하세요.For more information, see Redistributing Visual C++ Files.

다음 표에는 UCRT를 구현하는 라이브러리가 나열되어 있습니다.The following table lists the libraries that implement the UCRT.

라이브러리Library 관련 DLLAssociated DLL 특성Characteristics 옵션Option 전처리기 지시문Preprocessor directives
libucrt.liblibucrt.lib 없음None 코드에 UCRT를 정적으로 연결합니다.Statically links the UCRT into your code. /MT/MT _MT_MT
libucrtd.liblibucrtd.lib 없음None 정적 연결을 위한 UCRT의 디버그 버전입니다.Debug version of the UCRT for static linking. 재배포할 수 없습니다.Not redistributable. /MTd/MTd _DEBUG, _MT_DEBUG, _MT
ucrt.libucrt.lib ucrtbase.dllucrtbase.dll UCRT에 대한 DLL 가져오기 라이브러리입니다.DLL import library for the UCRT. /MD/MD _MT, _DLL_MT, _DLL
ucrtd.libucrtd.lib ucrtbased.dllucrtbased.dll UCRT의 디버그 버전에 대한 DLL 가져오기 라이브러리입니다.DLL import library for the Debug version of the UCRT. 재배포할 수 없습니다.Not redistributable. /MDd/MDd _DEBUG, _MT, _DLL_DEBUG, _MT, _DLL

vcruntime 라이브러리에는 예외 처리 및 디버깅 지원, 런타임 검사 및 형식 정보, 구현 세부 정보 및 특정 확장된 라이브러리 기능 등 Visual C++ CRT 구현 관련 코드가 포함됩니다.The vcruntime library contains Visual C++ CRT implementation-specific code, such as exception handling and debugging support, runtime checks and type information, implementation details and certain extended library functions. 이 라이브러리는 사용된 컴파일러 버전에 따라 다릅니다.This library is specific to the version of the compiler used.

다음 표에는 vcruntime 라이브러리를 구현하는 라이브러리가 나열되어 있습니다.This table lists the libraries that implement the vcruntime library.

라이브러리Library 관련 DLLAssociated DLL 특성Characteristics 옵션Option 전처리기 지시문Preprocessor directives
libvcruntime.liblibvcruntime.lib 없음None 코드에 정적으로 연결합니다.Statically linked into your code. /MT/MT _MT_MT
libvcruntimed.liblibvcruntimed.lib 없음None 정적 연결에 대한 디버그 버전입니다.Debug version for static linking. 재배포할 수 없습니다.Not redistributable. /MTd/MTd _MT, _DEBUG_MT, _DEBUG
vcruntime.libvcruntime.lib vcruntime<version>.dllvcruntime<version>.dll vcruntime에 대한 DLL 가져오기 라이브러리입니다.DLL import library for the vcruntime. /MD/MD _MT, _DLL_MT, _DLL
vcruntimed.libvcruntimed.lib vcruntime<version>d.dllvcruntime<version>d.dll 디버그 vcruntime에 대한 DLL 가져오기 라이브러리입니다.DLL import library for the Debug vcruntime. 재배포할 수 없습니다.Not redistributable. /MDd/MDd _DEBUG, _MT, _DLL_DEBUG, _MT, _DLL

CRT를 초기화하는 코드는 CRT 라이브러리가 정적으로 연결되었는지, 동적으로 연결되었는지, 네이티브, 관리 또는 혼합 코드인지에 따라 여러 라이브러리 중 하나입니다.The code that initializes the CRT is in one of several libraries, based on whether the CRT library is statically or dynamically linked, or native, managed, or mixed code. 이 코드는 CRT 시작, 내부 스레드 단위 데이터 초기화 및 종료를 처리하며,This code handles CRT startup, internal per-thread data initialization, and termination. 사용된 컴파일러 버전에 따라 다릅니다.It is specific to the version of the compiler used. 이 라이브러리는 동적으로 연결된 UCRT를 사용하는 경우에도 항상 정적으로 연결됩니다.This library is always statically linked, even when using a dynamically linked UCRT.

다음 표에는 CRT 초기화 및 종료를 구현하는 라이브러리가 나열되어 있습니다.This table lists the libraries that implement CRT initialization and termination.

라이브러리Library 특성Characteristics 옵션Option 전처리기 지시문Preprocessor directives
LIBCMT.liblibcmt.lib 네이티브 CRT 시작을 코드에 정적으로 연결합니다.Statically links the native CRT startup into your code. /MT/MT _MT_MT
libcmtd.liblibcmtd.lib 네이티브 CRT 시작의 디버그 버전을 정적으로 연결합니다.Statically links the Debug version of the native CRT startup. 재배포할 수 없습니다.Not redistributable. /MTd/MTd _DEBUG, _MT_DEBUG, _MT
msvcrt.libmsvcrt.lib DLL UCRT 및 vcruntime과 함께 사용할 네이티브 CRT 시작에 대한 정적 라이브러리입니다.Static library for the native CRT startup for use with DLL UCRT and vcruntime. /MD/MD _MT, _DLL_MT, _DLL
msvcrtd.libmsvcrtd.lib DLL UCRT 및 vcruntime과 함께 사용할 네이티브 CRT 시작의 디버그 버전에 대한 정적 라이브러리입니다.Static library for the Debug version of the native CRT startup for use with DLL UCRT and vcruntime. 재배포할 수 없습니다.Not redistributable. /MDd/MDd _DEBUG, _MT, _DLL_DEBUG, _MT, _DLL
msvcmrt.libmsvcmrt.lib DLL UCRT 및 vcruntime과 함께 사용할 혼합된 네이티브 및 관리 CRT 시작에 대한 정적 라이브러리입니다.Static library for the mixed native and managed CRT startup for use with DLL UCRT and vcruntime. /clr/clr
msvcmrtd.libmsvcmrtd.lib DLL UCRT 및 vcruntime과 함께 사용할 혼합된 네이티브 및 관리 CRT 시작의 디버그 버전에 대한 정적 라이브러리입니다.Static library for the Debug version of the mixed native and managed CRT startup for use with DLL UCRT and vcruntime. 재배포할 수 없습니다.Not redistributable. /clr/clr
msvcurt.libmsvcurt.lib 사용되지 않음 순수 관리 CRT에 대한 정적 라이브러리입니다.Deprecated Static library for the pure managed CRT. /clr:pure/clr:pure
msvcurtd.libmsvcurtd.lib 사용되지 않음 순수 관리 CRT의 디버그 버전에 대한 정적 라이브러리입니다.Deprecated Static library for the Debug version of the pure managed CRT. 재배포할 수 없습니다.Not redistributable. /clr:pure/clr:pure

C 런타임 라이브러리를 지정하는 컴파일러 옵션을 사용하지 않고 명령줄에서 프로그램을 연결하면 링커는 정적으로 연결된 CRT 라이브러리, 즉 libcmt.lib, libvcruntime.lib 및 libucrt.lib를 사용합니다.If you link your program from the command line without a compiler option that specifies a C run-time library, the linker will use the statically linked CRT libraries: libcmt.lib, libvcruntime.lib, and libucrt.lib.

정적으로 연결된 CRT를 사용하면 C 런타임 라이브러리에서 저장하는 모든 상태 정보가 해당 CRT 인스턴스의 로컬에 있게 됩니다.Using the statically linked CRT implies that any state information saved by the C runtime library will be local to that instance of the CRT. 예를 들어 정적으로 연결된 CRT를 사용할 때 strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l을 사용하는 경우 strtok 파서의 위치는 정적 CRT의 다른 인스턴스에 연결된 동일한 프로세스에 있는(그러나 다른 DLL 또는 EXE에 있는) 코드에 사용되는 strtok 상태와 관련이 없습니다.For example, if you use strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l when using a statically linked CRT, the position of the strtok parser is unrelated to the strtok state used in code in the same process (but in a different DLL or EXE) that is linked to another instance of the static CRT. 반면 동적으로 연결된 CRT는 CRT에 동적으로 연결된 프로세스 내의 모든 코드에 대한 상태를 공유합니다.In contrast, the dynamically linked CRT shares state for all code within a process that is dynamically linked to the CRT. 이러한 함수의 더 안전한 새 버전을 사용하는 경우 이 문제는 적용되지 않습니다. 예를 들어 strtok_s 에서는 이 문제가 발생하지 않습니다.This concern does not apply if you use the new more secure versions of these functions; for example, strtok_s does not have this problem.

정적 CRT에 연결하여 작성된 DLL에는 자체 CRT 상태가 있으므로 DLL에서 CRT에 정적으로 연결하는 것은 이로 인한 결과를 특별히 원하거나 알고 있는 경우 외에는 권장되지 않습니다.Because a DLL built by linking to a static CRT will have its own CRT state, it is not recommended to link statically to the CRT in a DLL unless the consequences of this are specifically desired and understood. 예를 들어 자체의 정적 CRT에 연결된 DLL를 로드하는 실행 파일에서 _set_se_translator 를 호출하는 경우 DLL의 코드에서 생성되는 하드웨어 예외는 catch되지 않지만 주 실행 파일의 코드에서 생성되는 하드웨어 예외는 catch됩니다.For example, if you call _set_se_translator in an executable that loads the DLL linked to its own static CRT, any hardware exceptions generated by the code in the DLL will not be caught by the translator, but hardware exceptions generated by code in the main executable will be caught.

/clr 컴파일러 스위치를 사용하는 경우 코드가 정적 라이브러리인 msvcmrt.lib와 연결됩니다.If you are using the /clr compiler switch, your code will be linked with a static library, msvcmrt.lib. 이 정적 라이브러리는 관리 코드와 네이티브 CRT 사이의 프록시를 제공합니다.The static library provides a proxy between your managed code and the native CRT. 정적으로 연결된 CRT( /MT 또는 /MTd 옵션)를 /clr과 함께 사용할 수 없습니다.You cannot use the statically linked CRT ( /MT or /MTd options) with /clr. 대신 동적으로 연결된 라이브러리(/MD 또는 /MDd)를 사용하세요.Use the dynamically-linked libraries (/MD or /MDd) instead.

/clr:pure 컴파일러 스위치를 사용하는 경우 코드는 정적 라이브러리 msvcurt.lib와 연결됩니다.If you are using the /clr:pure compiler switch, your code will be linked with the static library msvcurt.lib. /clr과 마찬가지로 정적으로 연결된 라이브러리와 연결할 수 없습니다.As with /clr, you cannot link with the statically linked library. /clr:pure/clr:safe 컴파일러 옵션은 Visual Studio 2015부터 더 이상 사용되지 않습니다.The /clr:pure and /clr:safe compiler options are deprecated starting in Visual Studio 2015.

/clr과 함께 CRT를 사용하는 방법에 대한 자세한 내용은 혼합형(네이티브 및 관리) 어셈블리를 참조하고, /clr:pure의 경우 순수형 및 안정형 코드(C++/CLI)를 참조하세요.For more information on using the CRT with /clr, see Mixed (Native and Managed) Assemblies; for /clr:pure, see Pure and Verifiable Code (C++/CLI).

응용 프로그램의 디버그 버전을 빌드하려면 _DEBUG 플래그를 정의해야 하며 응용 프로그램을 이러한 라이브러리 중 하나의 디버그 버전과 연결해야 합니다.To build a debug version of your application, the _DEBUG flag must be defined and the application must be linked with a debug version of one of these libraries. 라이브러리 파일의 디버그 버전을 사용하는 방법에 대한 자세한 내용은 참조 CRT 디버깅 기술을 참조하세요.For more information about using the debug versions of the library files, see CRT Debugging Techniques.

이 버전의 CRT는 C99 표준을 완벽하게 준수하지 않습니다.This version of the CRT is not fully conformant with the C99 standard. 특히 <tgmath.h> 헤더 및 CX_LIMITED_RANGE/FP_CONTRACT pragma 매크로는 지원되지 않습니다.In particular, the <tgmath.h> header and the CX_LIMITED_RANGE/FP_CONTRACT pragma macros are not supported. 표준 IO 함수에서 매개 변수 지정자의 의미와 같은 특정 요소는 기본적으로 레거시 해석을 사용합니다.Certain elements such as the meaning of parameter specifiers in standard IO functions use legacy interpretations by default. /Zc 컴파일러 규칙 옵션을 사용하고 링커 옵션을 지정하여 라이브러리 규칙의 일부 측면을 제어할 수 있습니다.You can use /Zc compiler conformance options and specify linker options to control some aspects of library conformance,

C++ 표준 라이브러리C++ Standard Library

C++ 표준 라이브러리C++ Standard Library 특성Characteristics 옵션Option 전처리기 지시문Preprocessor directives
LIBCPMT.libLIBCPMT.LIB 다중 스레드, 정적 링크Multithreaded, static link /MT/MT _MT_MT
MSVCPRT.LIBMSVCPRT.LIB 다중 스레드, 동적 링크(MSVCP<version>.dll에 대한 가져오기 라이브러리)Multithreaded, dynamic link (import library for MSVCP<version>.dll) /MD/MD _MT, _DLL_MT, _DLL
LIBCPMTD.LIBLIBCPMTD.LIB 다중 스레드, 정적 링크Multithreaded, static link /MTd/MTd _DEBUG, _MT_DEBUG, _MT
MSVCPRTD.LIBMSVCPRTD.LIB 다중 스레드, 동적 링크(MSVCP<version>D.DLL에 대한 가져오기 라이브러리)Multithreaded, dynamic link (import library for MSVCP<version>D.DLL) /MDd/MDd _DEBUG, _MT, _DLL_DEBUG, _MT, _DLL

프로젝트의 릴리스 버전을 작성할 때 선택한 컴파일러 옵션(다중 스레드, DLL, /clr)에 따라 기본 C 런타임 라이브러리(LIBCMT.LIB, MSVCMRT.LIB, MSVCRT.LIB) 중 하나가 기본적으로 연결됩니다.When you build a release version of your project, one of the basic C run-time libraries (LIBCMT.LIB, MSVCMRT.LIB, MSVCRT.LIB) is linked by default, depending on the compiler option you choose (multithreaded, DLL, /clr). 코드에 C++ 표준 라이브러리 헤더 파일 중 하나를 포함하는 경우 컴파일 시 Visual C++에 의해 C++ 표준 라이브러리가 자동으로 연결됩니다.If you include one of the C++ Standard Library header files in your code, a C++ Standard Library will be linked in automatically by Visual C++ at compile time. 예:For example:

#include <ios>   

응용 프로그램에서 여러 CRT 버전을 사용하는 경우 발생하는 문제What problems exist if an application uses more than one CRT version?

둘 이상의 DLL 또는 EXE가 있는 경우에는 다른 버전의 Visual C++를 사용하는지 여부와 상관없이 둘 이상의 CRT가 있을 수 있습니다.If you have more than one DLL or EXE, then you may have more than one CRT, whether or not you are using different versions of Visual C++. 예를 들어 CRT를 여러 DLL에 정적으로 연결하면 동일한 문제가 발생할 수 있습니다.For example, statically linking the CRT into multiple DLLs can present the same problem. 정적 CRT에서 이 문제가 발생하는 경우 개발자는 /MD 로 컴파일하여 CRT DLL을 사용하게 됩니다.Developers encountering this problem with static CRTs have been instructed to compile with /MD to use the CRT DLL. DLL에서 DLL 경계를 넘어 CRT 리소스를 전달하는 경우 CRT가 일치하지 않는 문제가 발생하며 Visual C++를 사용하여 프로젝트를 다시 컴파일해야 합니다.If your DLLs pass CRT resources across the DLL boundary, you may encounter issues with mismatched CRTs and need to recompile your project with Visual C++.

프로그램 둘 이상의 CRT 버전을 사용하는 경우에는 특정 CRT 개체(예: 파일 핸들, 로캘 및 환경 변수)를 DLL 경계를 넘어 전달할 때 주의해야 합니다.If your program is using more than one version of the CRT, some care is needed when passing certain CRT objects (such as file handles, locales and environment variables) across DLL boundaries. 관련된 문제 및 해결 방법에 대한 자세한 내용은 DLL 경계를 넘어 CRT 개체를 전달할 때 발생할 수 있는 오류를 참조하세요.For more information on the issues involved and how to resolve them, see Potential Errors Passing CRT Objects Across DLL Boundaries.

참고 항목See Also

C 런타임 라이브러리 참조C Run-Time Library Reference