CRT 라이브러리 기능

이 항목에서는 C 런타임 라이브러리 및 관련 컴파일러 옵션과 전처리기 지시문을 구성하는 다양한 .lib 파일에 대해 설명합니다.

C 런타임 라이브러리(CRT)

다음 라이브러리에는 C 런타임 라이브러리 함수가 포함됩니다.

C 런타임 라이브러리(iostream 또는 표준 C++ 라이브러리 포함 안 함)

관련 DLL

특성

옵션

전처리기 지시문

libcmt.lib

없음, 정적 링크입니다.

다중 스레드, 정적 링크

/MT

_MT

msvcrt.lib

msvcr120.dll

다중 스레드, 동적 링크(MSVCR120.DLL에 대한 가져오기 라이브러리)입니다. 표준 C++ 라이브러리를 사용하는 경우 프로그램이 실행되려면 MSVCP120.DLL이 필요합니다.

/MD

_MT, _DLL

libcmtd.lib

없음, 정적 링크

다중 스레드, 정적 링크(디버그)

/MTd

_DEBUG, _MT

msvcrtd.lib

msvcr120d.dll

다중 스레드, 동적 링크(MSVCR120D.DLL에 대한 가져오기 라이브러리)(디버그)입니다.

/MDd

_DEBUG, _MT, _DLL

msvcmrt.lib

없음, 정적 링크

C 런타임 정적 라이브러리입니다. 혼합된 관리/네이티브 코드에 사용됩니다.

/clr

 

msvcurt.lib

없음, 정적 링크

100% 순수형 MSIL 코드로 컴파일된 C 런타임 정적 라이브러리입니다. 모든 코드는 MSIL에 대한 ECMA URT 사양을 준수합니다.

/clr:pure

 

참고

단일 스레드 CRT(libc.lib, libcd.lib)(이전의 /ML 또는 /MLd 옵션)를 더 이상 사용할 수 없습니다.대신 다중 스레드 CRT를 사용하세요.다중 스레드 라이브러리 성능을 참조하세요.

C 런타임 라이브러리를 지정하는 컴파일러 옵션 없이 명령줄에서 프로그램을 연결하는 경우 링커는 LIBCMT.LIB를 사용합니다. 이는 단일 스레드 LIBC.LIB를 대신 사용한 Visual C++의 이전 버전과 다릅니다.

정적으로 연결된 CRT를 사용하면 C 런타임 라이브러리에서 저장하는 모든 상태 정보가 해당 CRT 인스턴스의 로컬에 있게 됩니다. 예를 들어 정적으로 연결된 CRT를 사용할 때 strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l 를 사용하는 경우 strtok 파서의 위치는 정적 CRT의 다른 인스턴스에 연결된 동일한 프로세스에 있는(그러나 다른 DLL 또는 EXE에 있는) 코드에 사용되는 strtok 상태와 관련이 없습니다. 반면 동적으로 연결된 CRT는 CRT에 동적으로 연결된 프로세스 내의 모든 코드에 대한 상태를 공유합니다. 이러한 함수의 더 안전한 새 버전을 사용하는 경우 이 문제는 적용되지 않습니다. 예를 들어 strtok_s에서는 이 문제가 발생하지 않습니다.

정적 CRT에 연결하여 작성된 DLL에는 자체 CRT 상태가 있으므로 DLL에서 CRT에 정적으로 연결하는 것은 이로 인한 결과를 특별히 원하거나 알고 있는 경우 외에는 권장되지 않습니다. 예를 들어 자체의 정적 CRT에 연결된 DLL를 로드하는 실행 파일에서 _set_se_translator를 호출하는 경우 DLL의 코드에서 생성되는 하드웨어 예외는 catch되지 않지만 주 실행 파일의 코드에서 생성되는 하드웨어 예외는 catch됩니다.

/clr 컴파일러 스위치를 사용하는 경우 코드가 정적 라이브러리인 msvcmrt.lib와 연결됩니다. 이 정적 라이브러리는 관리 코드와 네이티브 CRT 사이의 프록시를 제공합니다. 정적으로 연결된 CRT( /MT 또는 /MTd 옵션)를 /clr과 함께 사용할 수 없습니다. 대신 동적으로 연결된 라이브러리(/MD 또는 /MDd)를 사용하세요.

/clr:pure 컴파일러 스위치를 사용하는 경우 코드는 정적 라이브러리 msvcurt.lib와 연결됩니다. /clr과 마찬가지로 정적으로 연결된 라이브러리와 연결할 수 없습니다.

/clr과 함께 CRT를 사용하는 방법에 대한 자세한 내용은 혼합형(네이티브 및 관리) 어셈블리를 참조하고 /clr:pure에 대해서는 순수형 및 안정형 코드(C++/CLI)를 참조하세요.

응용 프로그램의 디버그 버전을 작성하려면 하는 _DEBUG 플래그를 정의해야 하며 응용 프로그램을 이러한 라이브러리 중 하나의 디버그 버전과 연결해야 합니다. 라이브러리 파일의 디버그 버전을 사용하는 방법에 대한 자세한 내용은 참조 CRT 디버깅 기술을 참조하세요.

이 버전의 Visual C++는 C99 표준을 준수하지 않습니다.

표준 C++ 라이브러리

표준 C++ 라이브러리

특성

옵션

전처리기 지시문

LIBCPMT.LIB

다중 스레드, 정적 링크

/MT

_MT

MSVCPRT.LIB

다중 스레드, 동적 링크(MSVCP120.dll에 대한 가져오기 라이브러리)

/MD

_MT, _DLL

LIBCPMTD.LIB

다중 스레드, 정적 링크

/MTd

_DEBUG, _MT

MSVCPRTD.LIB

다중 스레드, 동적 링크(MSVCP120D.DLL에 대한 가져오기 라이브러리)

/MDd

_DEBUG, _MT, _DLL

참고   LIBCP.LIB 및 LIBCPD.LIB(이전 /ML/MLd 옵션을 통해)가 제거되었습니다. 대신 /MT/MTd 옵션을 통해 LIBCPMT.LIB 및 LIBCPMTD.LIB를 사용하세요.

프로젝트의 릴리스 버전을 작성할 때 선택한 컴파일러 옵션(다중 스레드, DLL, /clr)에 따라 기본 C 런타임 라이브러리(LIBCMT.LIB, MSVCMRT.LIB, MSVCRT.LIB) 중 하나가 기본적으로 연결됩니다. 코드에 C++ 표준 라이브러리 헤더 파일 중 하나를 포함하는 경우 컴파일 시 Visual C++에 의해 표준 C++ 라이브러리가 자동으로 연결됩니다. 예:

#include <ios> 

Visual Studio에서 연결된 기본 C 런타임 라이브러리를 변경하려면 프로젝트에 대한 한 속성 페이지를 엽니다. 구성 속성, C/C++, 코드 생성 페이지를 열고 런타임 라이브러리 설정을 변경합니다. 공용 언어 런타임 라이브러리를 변경하려면 프로젝트에 대한 속성 페이지를 엽니다. 구성 속성, C/C++, 일반 페이지를 연 다음 공용 언어 런타임 지원 설정을 변경합니다.

msvcrt.dll과 msvcr120.dll의 차이점은 무엇인가요?

msvcrt.dll은 이제 "알려진 DLL"입니다. 즉, Windows에서 소유하며 빌드하는 시스템 구성 요소입니다. 시스템 수준 구성 요소에서만 나중에 사용하기 위한 것입니다.

응용 프로그램에서 msvcrt.dll과 msvcr120.dll을 모두 사용하는 경우 어떤 문제가 있나요?

msvcrt.lib에 연결해야 하는 .lib 또는 .obj 파일이 있는 경우 다시 컴파일하지 않아도 Visual C++의 새 msvcrt.lib와 작동합니다. .lib 또는 .obj 파일은 다양한 CRT 클래스 또는 변수의 크기, 필드 오프셋 또는 멤버 함수 이름을 사용할 수 있으며 이들이 모두 호환 가능한 방식으로 존재합니다. msvcrt.lib에 다시 연결하면 최종 EXE 및 DLL 이미지는 이제 msvcrt.dll아 아니라 msvcr120.dll에 종속됩니다.

둘 이상의 DLL 또는 EXE가 있는 경우에는 다른 버전의Visual C++를 사용하는지 여부와 상관없이 둘 이상의 CRT가 있을 수 있습니다. 예를 들어 CRT를 여러 DLL에 정적으로 연결하면 동일한 문제가 발생할 수 있습니다. 정적 CRT에서 이 문제가 발생하는 경우 개발자는 /MD로 컴파일하여 CRT DLL을 사용하게 됩니다. CRT DLL의 이름이 msvcr120.dll로 바뀌었으므로 응용 프로그램의 일부 구성 요소는 msvcrt.dll로 연결되고 일부 구성 요소는 msvcr120.dll에 연결될 수 있습니다. DLL에서 msvcrt.dll 및 msvcr120.dll 경계를 넘어 CRT 리소스를 전달하는 경우 CRT가 일치하지 않는 문제가 발생하며 Visual C++를 사용하여 프로젝트를 다시 컴파일해야 합니다.

프로그램 둘 이상의 CRT 버전을 사용하는 경우에는 특정 CRT 개체(예: 파일 핸들, 로캘 및 환경 변수)를 DLL 경계를 넘어 전달할 때 주의해야 합니다. 관련된 문제와 문제 해결 방법에 대한 자세한 내용은 DLL 경계를 넘어 CRT 개체를 전달할 때 발생할 수 있는 오류를 참조하세요.

참고 항목

기타 리소스

C 런타임 라이브러리 참조