C 런타임(CRT) 및 C++ STL(표준 라이브러리) .lib
파일
이 문서에서는 애플리케이션을 개발할 때 연결할 수 있는 Microsoft C 런타임 라이브러리 .lib
파일과 관련 컴파일러 옵션 및 전처리기 지시문을 나열합니다.
애플리케이션을 지원하는 데 필요한 C 런타임 파일 배포에 대한 정보를 찾으려면 Visual C++ 파일 재배포를 참조하세요.
C 런타임 라이브러리에 대한 API 참조를 찾으려면 C 런타임 라이브러리 참조를 참조하세요.
참고 항목
Microsoft의 C++ 표준 라이브러리 구현을 STL 또는 표준 템플릿 라이브러리라고도 합니다. C++ 표준 라이브러리는 ISO 14882에 정의된 대로 라이브러리의 공식 이름이지만 검색 엔진에서 "STL" 및 "표준 템플릿 라이브러리"를 널리 사용하므로 이러한 이름을 사용하여 설명서를 더 쉽게 찾을 수 있습니다.
역사적 관점에서, "STL"원래 알렉산더 스테파노프에 의해 작성 된 표준 템플릿 라이브러리를 참조. 해당 라이브러리의 일부는 C++ 표준 라이브러리에서 표준화되었습니다. 표준 라이브러리는 ISO C 런타임 라이브러리, Boost 라이브러리의 일부 및 기타 기능도 통합합니다. 때때로 "STL"은 Stepanov의 STL에서 조정된 C++ 표준 라이브러리의 컨테이너 및 알고리즘 부분을 참조하는 데 사용됩니다. 이 설명서에서 STL(표준 템플릿 라이브러리)은 C++ 표준 라이브러리 전체를 참조합니다.
C 런타임 .lib
파일
ISO C 표준 라이브러리는 C++ 표준 라이브러리의 일부입니다. CRT를 구현하는 Visual C++ 라이브러리는 네이티브 코드 개발 및 혼합된 네이티브와 관리 코드를 모두 지원합니다. 모든 버전의 CRT는 다중스레드 개발을 지원합니다. 대부분의 라이브러리는 라이브러리를 코드에 직접 연결하는 정적 연결이나 코드에서 공용 DLL 파일을 사용할 수 있도록 하는 동적 연결을 모두 지원합니다.
Visual Studio 2015에서 CRT는 새 이진 파일로 리팩터링되었습니다. UCRT(유니버설 CRT)에는 표준 C99 CRT 라이브러리에서 내보낸 전역 변수 및 함수가 포함됩니다. UCRT는 이제 Windows 구성 요소이며 Windows 10 이상 버전의 일부로 제공됩니다. 이제 UCRT에 대한 정적 라이브러리, DLL 가져오기 라이브러리 및 헤더 파일이 Windows SDK에 있습니다. Visual C++를 설치하면 Visual Studio 설치 프로그램에서 UCRT를 사용하는 데 필요한 Windows SDK의 하위 집합을 설치합니다. Visual Studio 2015 이상 버전에서 지원하는 모든 Windows 버전에서 UCRT를 사용할 수 있습니다. Windows 10 이상이 아닌 지원되는 Windows 버전에 대해 vcredist를 사용하여 재배포할 수 있습니다. 자세한 내용은 Visual C++ 파일 재배포를 참조하세요.
다음 표에는 UCRT를 구현하는 라이브러리가 나열되어 있습니다.
라이브러리 | 관련 DLL | 특성 | 옵션 | 전처리기 지시문 |
---|---|---|---|---|
libucrt.lib |
None | 코드에 UCRT를 정적으로 연결합니다. | /MT |
_MT |
libucrtd.lib |
None | 정적 연결을 위한 UCRT의 디버그 버전입니다. 재배포할 수 없습니다. | /MTd |
_DEBUG , _MT |
ucrt.lib |
ucrtbase.dll |
UCRT에 대한 DLL 가져오기 라이브러리입니다. | /MD |
_MT , _DLL |
ucrtd.lib |
ucrtbased.dll |
UCRT의 디버그 버전에 대한 DLL 가져오기 라이브러리입니다. 재배포할 수 없습니다. | /MDd |
_DEBUG , , _MT _DLL |
vcruntime 라이브러리에는 예외 처리 및 디버깅 지원, 런타임 검사 및 형식 정보, 구현 세부 정보 및 특정 확장 라이브러리 함수와 같은 Visual C++ CRT 구현 관련 코드가 포함되어 있습니다. vcruntime 라이브러리 버전은 사용 중인 컴파일러 버전과 일치해야 합니다.
다음 표에는 vcruntime 라이브러리를 구현하는 라이브러리가 나열되어 있습니다.
라이브러리 | 관련 DLL | 특성 | 옵션 | 전처리기 지시문 |
---|---|---|---|---|
libvcruntime.lib |
None | 코드에 정적으로 연결합니다. | /MT |
_MT |
libvcruntimed.lib |
None | 정적 연결에 대한 디버그 버전입니다. 재배포할 수 없습니다. | /MTd |
_MT , _DEBUG |
vcruntime.lib |
vcruntime<version>.dll |
vcruntime에 대한 DLL 가져오기 라이브러리입니다. | /MD |
_MT , _DLL |
vcruntimed.lib |
vcruntime<version>d.dll |
디버그 vcruntime에 대한 DLL 가져오기 라이브러리입니다. 재배포할 수 없습니다. | /MDd |
_DEBUG , , _MT _DLL |
참고 항목
UCRT가 리팩터링되었을 때 동시성 런타임 함수가 C++ 재배포 가능 패키지에 추가된 상태로 concrt140.dll
이동되었습니다. 이 DLL은 concurrency::parallel_for
와 같은 C++ 병렬 컨테이너 및 알고리즘에 대해 필요합니다. 또한 Windows XP에는 조건 변수가 없으므로 동기화 기본 형식을 지원하려면 C++ 표준 라이브러리에 Windows XP의 이 DLL이 필요합니다.
CRT를 초기화하는 코드는 CRT 라이브러리가 정적으로 연결되었는지, 동적으로 연결되었는지, 네이티브, 관리 또는 혼합 코드인지에 따라 여러 라이브러리 중 하나입니다. 이 코드는 CRT 시작, 내부 스레드 단위 데이터 초기화 및 종료를 처리하며, 사용되는 컴파일러 버전과 관련이 있습니다. 이 라이브러리는 동적으로 연결된 UCRT를 사용하는 경우에도 항상 정적으로 연결됩니다.
다음 표에는 CRT 초기화 및 종료를 구현하는 라이브러리가 나열되어 있습니다.
라이브러리 | 특성 | 옵션 | 전처리기 지시문 |
---|---|---|---|
libcmt.lib |
네이티브 CRT 시작을 코드에 정적으로 연결합니다. | /MT |
_MT |
libcmtd.lib |
네이티브 CRT 시작의 디버그 버전을 정적으로 연결합니다. 재배포할 수 없습니다. | /MTd |
_DEBUG , _MT |
msvcrt.lib |
DLL UCRT 및 vcruntime과 함께 사용할 네이티브 CRT 시작에 대한 정적 라이브러리입니다. | /MD |
_MT , _DLL |
msvcrtd.lib |
DLL UCRT 및 vcruntime과 함께 사용할 네이티브 CRT 시작의 디버그 버전에 대한 정적 라이브러리입니다. 재배포할 수 없습니다. | /MDd |
_DEBUG , , _MT _DLL |
msvcmrt.lib |
DLL UCRT 및 vcruntime과 함께 사용할 혼합된 네이티브 및 관리 CRT 시작에 대한 정적 라이브러리입니다. | /clr |
|
msvcmrtd.lib |
DLL UCRT 및 vcruntime과 함께 사용할 혼합된 네이티브 및 관리 CRT 시작의 디버그 버전에 대한 정적 라이브러리입니다. 재배포할 수 없습니다. | /clr |
|
msvcurt.lib |
사용되지 않음 순수 관리 CRT에 대한 정적 라이브러리입니다. | /clr:pure |
|
msvcurtd.lib |
사용되지 않음 순수 관리 CRT의 디버그 버전에 대한 정적 라이브러리입니다. 재배포할 수 없습니다. | /clr:pure |
C 런타임 라이브러리를 지정하는 컴파일러 옵션 없이 명령줄에서 프로그램을 연결하는 경우 링커는 정적으로 연결된 CRT 라이브러리( libcmt.lib
, libvcruntime.lib
및 libucrt.lib
)를 사용합니다.
정적으로 연결된 CRT를 사용하면 C 런타임 라이브러리에서 저장하는 모든 상태 정보가 해당 CRT 인스턴스의 로컬에 있게 됩니다. 예를 들어 정적으로 연결된 CRT를 사용할 때 사용하는 strtok
경우 파서의 위치는 정적 CRT의 strtok
다른 인스턴스에 연결된 동일한 프로세스(다른 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
)를 사용합니다. 순수 관리 CRT 라이브러리는 Visual Studio 2015에서 사용되지 않으며 Visual Studio 2017에서 지원되지 않습니다.
CRT /clr
를 사용하는 방법에 대한 자세한 내용은 혼합(네이티브 및 관리형) 어셈블리를 참조 하세요.
애플리케이션의 디버그 버전을 빌드하려면 플래그를 _DEBUG
정의해야 하며 이러한 라이브러리 중 하나의 디버그 버전과 애플리케이션을 연결해야 합니다. 라이브러리 파일의 디버그 버전을 사용하는 방법에 대한 자세한 내용은 CRT 디버깅 기술을 참조 하세요.
이 버전의 CRT는 C99 표준을 완전히 준수하지 않습니다. Visual Studio 2019 버전 16.8 이전 버전에서는 헤더가 <tgmath.h>
지원되지 않습니다. 모든 버전 CX_LIMITED_RANGE
에서는 pragma 매크로와 FP_CONTRACT
pragma 매크로가 지원되지 않습니다. 표준 IO 함수에서 매개 변수 지정자의 의미와 같은 특정 요소는 기본적으로 레거시 해석을 사용합니다. 컴파일러 규칙 옵션을 사용하고 /Zc
링커 옵션을 지정하여 라이브러리 규칙의 일부 측면을 제어할 수 있습니다.
C++ STL(표준 라이브러리) .lib
파일
C++ 표준 라이브러리 | 특성 | 옵션 | 전처리기 지시문 |
---|---|---|---|
libcpmt.lib |
다중 스레드, 정적 링크 | /MT |
_MT |
msvcprt.lib |
다중 스레드 동적 링크(에 대한 msvcp<version>.dll 라이브러리 가져오기) |
/MD |
_MT , _DLL |
libcpmtd.lib |
다중 스레드, 정적 링크 | /MTd |
_DEBUG , _MT |
msvcprtd.lib |
다중 스레드 동적 링크(에 대한 msvcp<version>d.dll 라이브러리 가져오기) |
/MDd |
_DEBUG , , _MT _DLL |
프로젝트의 릴리스 버전을 빌드할 때 기본 C 런타임 라이브러리(libcmt.lib
, msvcmrt.lib
, msvcrt.lib
) 중 하나는 선택한 컴파일러 옵션(다중 스레드, DLL, /clr
)에 따라 기본적으로 연결됩니다. 코드에 C++ 표준 라이브러리 헤더 파일 중 하나를 포함하는 경우 C++ 표준 라이브러리는 컴파일 시간에 Visual C++에 의해 자동으로 연결됩니다. 예시:
#include <ios>
이진 호환성을 위해 단일 가져오기 라이브러리에서 둘 이상의 DLL 파일을 지정할 수 있습니다. 버전 업데이트는 새로운 라이브러리 기능을 도입하는 별도의 DLL인 도트 라이브러리를 도입할 수 있습니다. 예를 들어 Visual Studio 2017 버전 15.6은 지원되는 ABI(애플리케이션 이진 인터페이스)를 중단하지 않고 더 많은 표준 라이브러리 기능을 지원하기 위해 도입 msvcp140_1.dll
되었습니다 msvcp140.dll
. Visual Studio 2017 버전 15.6용 도구 집합에 포함된 가져오기 라이브러리는 msvcprt.lib
DLL을 모두 지원하며 이 버전의 vcredist는 두 DLL을 모두 설치합니다. 출시되면 도트 라이브러리는 고정 ABI를 가지며 이후 도트 라이브러리에 대한 종속성을 갖지 않습니다.
애플리케이션에서 여러 CRT 버전을 사용하는 경우 발생하는 문제
모든 실행 가능 이미지(EXE 또는 DLL)에는 고유한 정적으로 연결된 CRT가 있을 수 있거나, CRT에 동적으로 연결할 수 있습니다. 특정 이미지에 의해 정적으로 포함되거나 동적으로 로드된 CRT의 버전은 빌드한 도구 및 라이브러리 버전에 따라 다릅니다. 단일 프로세스는 여러 EXE 및 DLL 이미지를 로드할 수 있으며 각각 고유한 CRT가 있습니다. 각 해당 CRT는 다른 할당자를 사용하고, 다른 내부 구조체 레이아웃을 가지며, 다른 스토리지 배열을 사용할 수 있습니다. 할당된 메모리, CRT 리소스 또는 DLL 경계를 넘어 전달된 클래스는 메모리 관리, 내부 정적 사용 또는 레이아웃 해석에 문제를 일으킬 수 있습니다. 예를 들어, 클래스가 하나의 DLL에 할당되었지만 다른 DLL에서 삭제했다면 어떤 CRT 비할당자가 사용될까요? 발생한 오류는 미묘한 오류부터 즉시 치명적인 오류까지 다양할 수 있으므로 이러한 리소스의 직접 전송은 권장되지 않습니다.
안정적이고 버전 관리 가능하도록 설계되어 있으므로 ABI(애플리케이션 이진 인터페이스) 기술을 대신 사용하여 이러한 많은 문제를 방지할 수 있습니다. DLL 내보내기 인터페이스를 디자인하여 값으로 정보를 전달하거나, 로컬에서 할당되어 호출자에게 반환되는 대신 호출자가 전달하는 메모리에 대해 작업합니다. 마샬링 기술을 사용하여 실행 이미지 간에 구조화된 데이터를 복사합니다. 리소스를 로컬에서 캡슐화하고 클라이언트에 공개하는 핸들 또는 함수를 통해서만 조작을 허용합니다.
프로세스의 모든 이미지가 동적으로 로드된 동일한 버전의 CRT를 사용하는 경우에도 이러한 문제를 피할 수 있습니다. 모든 구성 요소가 CRT의 동일한 DLL 버전을 사용하도록 하려면 옵션을 사용하여 /MD
빌드하고 동일한 컴파일러 도구 집합 및 속성 설정을 사용합니다.
프로그램이 DLL 경계를 넘어 특정 CRT 리소스를 통과하는 경우 주의해야 합니다. 파일 핸들, 로캘 및 환경 변수와 같은 리소스는 동일한 버전의 CRT를 사용하는 경우에도 문제를 일으킬 수 있습니다. 관련된 문제 및 해결 방법에 대한 자세한 내용은 DLL 경계를 넘어 CRT 개체를 전달하는 잠재적 오류를 참조 하세요.