CRT 라이브러리 기능

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

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

다음 라이브러리 C 런타임 라이브러리 함수를 포함 합니다.

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

관련된 DLL

특성

옵션

전처리기 지시문

libcmt.lib

없음, 정적 링크입니다.

다중 스레드, 정적 링크

/MT

_MT

msvcrt.lib

msvcr110.dll

다중 스레드 동적 링크 (msvcr110에 대 한 가져오기 라이브러리입니다.DLL)입니다.표준 C++ 라이브러리를 사용 하는 경우 프로그램을 MSVCP110 해야 한다는 것에 주의 합니다.DLL을 실행 합니다.

/MD

_MT _DLL

libcmtd.lib

없음, 정적 링크

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

/MTd

_DEBUG, _MT

msvcrtd.lib

msvcr110d.dll

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

/MDd

_DEBUG, _MT _DLL

msvcmrt.lib

없음, 정적 링크

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

/clr

/clr:oldSyntax

 

msvcurt.lib

없음, 정적 링크

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

/clr:pure

 

[!참고]

단일 스레드 CRT (libc.lib, libcd.lib) (이전에 /ML 또는 /MLd 옵션) 사용할 수 없습니다.다중 스레드 CRT를 대신 사용 합니다.자세한 내용은 다중 스레드 라이브러리 성능를 참조하십시오.

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

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

정적 CRT에 연결 하 여 작성 된 DLL 자체 CRT 상태 다르므로 그 결과이 특히 원하는 이해 되지 않는 DLL에서 CRT에 정적으로 링크를 권장 하지 않습니다.예를 들어, 사용자가 호출 하는 경우 _set_se_translator 로드 DLL 자체를 정적 CRT 연결, 하드웨어 예외 코드는 DLL에 의해 생성 되는 변환기가 잡히지 않습니다 있지만 주 실행 파일에 코드 생성 된 하드웨어 예외를 catch 하는 실행 파일에 있습니다.

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

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

CRT를 사용 하 여에 대 한 자세한 내용은 /clr를 참조 하십시오 혼합형(네이티브 및 관리) 어셈블리. for /clr:pure, see 순수형 및 안정형 코드(C++/CLI).

응용 프로그램의 디버그 버전을 빌드할 수 있는 _DEBUG 플래그를 정의 해야 하 고 응용 프로그램 디버그 버전의 이러한 라이브러리 중 하나에 연결 되어야 합니다.라이브러리 파일의 디버그 버전을 사용 하는 방법에 대 한 자세한 내용은 CRT 디버깅 기술.

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

표준 C++ 라이브러리

표준 C++ 라이브러리

특성

옵션

전처리기 지시문

LIBCPMT입니다.LIB

다중 스레드, 정적 링크

/MT

_MT

MSVCPRT입니다.LIB

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

/MD

_MT _DLL

LIBCPMTD입니다.LIB

다중 스레드, 정적 링크

/MTd

_DEBUG, _MT

MSVCPRTD입니다.LIB

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

/MDd

_DEBUG, _MT _DLL

참고 LIBCP.LIB 및 LIBCPD입니다.LIB (이전을 통해 /ML/MLd 옵션) 제거 되었습니다.LIBCPMT를 사용 합니다.LIB 및 LIBCPMTD입니다.대신 통해 라이브러리는 /MT/MTd 옵션.

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

#include <ios> 

Msvcrt.dll msvcr110.dll 사이의 차이점은 무엇입니까?

Msvcrt.dll의 이제 "소유 하 고 Windows에서 기본 제공 시스템 구성 요소가 없는 알려진된 DLL,"입니다.시스템 수준 구성 요소로 나중에 사용 하기 위한 것입니다.

Msvcrt.dll과 msvcr110.dll 응용 프로그램을 사용 하는 경우에 어떤 문제가 있습니까?

Msvcrt.lib를 연결 하는 데 필요한.lib 또는.obj 파일이 있으면 새 msvcrt.lib Visual C++에서를 사용 하 여 다시 컴파일할 필요가 없습니다..Lib 또는.obj 파일 크기, 필드 오프셋 또는 다양 한 CRT 클래스나 변수 멤버 함수 이름에 사용할 수 및 호환 방식으로 이러한 모든 여전히 존재 합니다.Msvcrt.lib에 대해 다시 때 EXE 및 DLL 최종 이미지를 지금 종속성 msvcrt.dll 대신 msvcr110.dll를 갖게 됩니다.

둘 이상의 DLL 또는 exe를 실행 한 경우의 다른 버전을 사용 하는 여부에 상관 없이 두 개 이상 CRT를 가질 수 있습니다 Visual C++.예를 들어, 정적 CRT 여러 개의 Dll로 링크 같은 문제가 발생할 수 있습니다.이 정적 crt에서이 문제가 발생 하는 개발자를 컴파일하려면 지시 되었습니다가 /MD CRT DLL을 사용 합니다.CRT DLL msvcr110.dll으로 바뀐 다음에 응용 프로그램 msvcrt.dll 등 msvcr110.dll에 연결 된 일부 구성 요소가 있을 수 있습니다.Msvcrt.dll msvcr110.dll 하 고 경계를 넘어 리소스 CRT Dll을 전달 하는 경우 일치 하지 않는 crt에서 문제가 발생 하 고 Visual C++를 사용 하 여 프로젝트를 다시 컴파일해야 합니다.

프로그램을 두 개 이상 버전의 CRT 사용 하 고 있으면 주의 특정 CRT 개체 (예: 파일 핸들, 로캘 및 환경 변수)을 전달 하는 경우 DLL 경계를 넘어 필요 합니다.관련 된 문제에 대 한 자세한 내용은 하 고 이러한 문제를 해결 하는 방법을 참조 하십시오. 잠재적 오류 개체 CRT DLL 경계를 넘어 전달.

참고 항목

기타 리소스

C 런타임 라이브러리 참조