LIBRARY : LIBCMT, LIBCPMT, MSVCRT, MSVCPRT 윈도우



Visual Studio 에서 C++ 프로젝트를 진행할때 어떤 C 라이브러리가 정적으로 혹은 동적으로, 링크될지는 프로젝트 옵션에 따라서 달라진다.



일반적으로 C Run-time Library(이하 CRT) 는 우리가 프로젝트에서 빌드 옵션을 어떻게 주냐에 따라서 다르게 링크된다.

위에서는 6가지 경우가 나와 있지만, 우리는 Native Code 를 작성한다고 가정하고 위의 4가지 경우에 대해서 알아보자.



LIBCMT.LIB
: /MT 옵션에 해당한다. CRT 를 정적으로 링크한다. (이미지 사이즈가 커지지만, 의존성 문제는 발생하지 않는다.)

LIBCMTD.LIB
: /MTd 옵션에 해당한다. 디버그 버전 CRT를 정적 링크한다.

MSVCRT.LIB
: /MD 옵션에 해당한다. CRT 를 동적으로 링크한다. 프로그램이 MSVCR100.DLL 을 필요로 한다.

MSVCRTD.LIB
: /MDd 옵션에 해당한다. CRT 를 동적으로 링크한다. 프로그램이 MSVCR100D.DLL 을 필요로 한다.



CRT 를 정적으로 링크한다는 것은 CRT 상태 정보가 CRT 로컬 인스턴스에 저장된다는 것을 의미한다. 예를 들어서, strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_과 같은 함수들을 사용한다면 strtok parse의 위치 정보는, 같은 프로세스 내의 같은 코드에서 사용되는 다른 CRT 인스턴스의 상태와는 전혀 관련이 없다. 즉, 각각의 상태정보는 각각의 CRT 인스턴스 내에 저장된다. CRT 힙이 다르게 존재하므로 정적으로 링크한 라이브러리 내의 힙 주소를 용용 프로그램에서 해제하려고 할 경우 Access Violation이 발생한다. 이와는 반대로 CRT를 동적으로 링크 할 경우에는 모든 이미지가 CRT 인스턴스를 공유한다. 이러한 문제는 strtok_s 와 같은 함수의 Secure 버전을 사용할 경우에는 문제가 되지 않는다. 

(컴파일시) 정적으로 CRT가 링크된 DLL도 문제가 될 수 있다. 정적으로 CRT가 링크되면 DLL은 자신만의 CRT 인스턴스를 갖는다. 따라서 주 실행파일(DLL을 로드하는)과는 다른 CRT 인스턴스를 갖게되고, DLL의 코드에서 발생한 하드웨어 예외가 잡히지 않게 된다. 예외를 잡기위해 실행 파일에서 _set_se_translator 함수를 실행시켜도 DLL은 자신의 코드에서 발생한 하드웨어 예외를 실행파일의 코드까지 넘겨주지 않고 스스로 처리해 버린다. 이런 이유에서, DLL은 동적으로 CRT와 링크되어야 한다.



프로그램이 추가적으로 Standard C++ Library 를 사용하는 경우에는 추가적으로 위의 라이브러리들이 링크된다.

예를들어, 프로그램 코드 내에 #include <iostream> 이란 코드가 존재하고, /MD 옵션이 설정되어있다면

MSVCPRT.LIB 가 자동으로 링크되고, 런타임에 프로그램은 MSVCP100.DLL 을 요구한다.

아래는 Stadard C++ Library 헤더 목록이다.





 LIBCPMT.LIB
/MT 옵션에 해당한다. Standard C++ Library 를 정적으로 링크한다. 

LIBCPMTD.LIB
/MTd 옵션에 해당한다. 디버그 버전 Standard C++ Library를 정적 링크한다.

MSVCPRT.LIB
/MD 옵션에 해당한다. Standard C++ Library 를 동적으로 링크한다. 프로그램이 MSVCP100.DLL 을 필요로 한다.

MSVCPRTD.LIB
/MDd 옵션에 해당한다. Standard C++ Library 를 동적으로 링크한다. 프로그램이 MSVCP100D.DLL 을 필요로 한다.





* 링크시 연결되는 라이브러리들을 확인하고 싶다면, 링크 옵션에서 /VERBOSE:LIB 를 입력하면 된다.
* MDd, MD 옵션을 사용할 경우 실제로 DLL 이 연결되는지 확인하고 싶다면 Dependency Walker 를 이용하면 된다.




                 - http://naiades.tistory.com/44

덧글

댓글 입력 영역


시계

라운드 시계

위키피디아