Post List

2014년 12월 19일 금요일

MFC DLL 종류 및 /MD, /MT 차이

DLL은 크게 세종류로 나누어집니다.
[일반], [확장], [MFC 확장]
...
1. [일반] - 함수를 export하는 보통의 DLL 입니다.
호환성을 위하여 주로 extern "C"를 사용합니다.

2. [확장] - 함수 뿐 아니라 C++ 클래스를 export하는 DLL 입니다.
여기서는 extern "C"를 사용할 수 없습니다.

3. [MFC 확장] - 확장 DLL을 기본으로 하면서 '공유 MFC Dll'을
연결한 것으로 오직 /MD에서만 사용할 수 있습니다.

[일반]과 [확장] DLL의 경우 _USRDLL이 선언되고,
[MFC 확장]의 경우 _AFXEXT가 선언됩니다.
[일반]과 [확장]은 CRT 관련 기능을 DLL로 연결하거나 (/MD)
정적 라이브러리로 연결할 수 있습니다. (/MT)
그에 비해서 [MFC 확장] DLL은 오직 (/MD)만 가능합니다.
[확장] DLL에서도 MFC를 사용할 수 있어서
[MFC 확장] DLL과 무슨 차이가 있는지 궁금할 수 있는데요.
그 부분은 좀 더 알아보아야 할 것 같습니다.
제가 테스트하기로는 [MFC 확장]을 사용하지 않아도
[확장] DLL에서 MFC 클래스를 사용하는데 큰 문제가
있는 것은 아니었습니다.

윈도우 C++ 프로그래밍시 /MD, /MT 개념이 나와서 어려운 경우가
있습니다.

간단히 정리해서 C++ 프로그래밍을 할 때 중요한 것을 꼽으라고
한다면 바로 C Runtime Library(CRT)와 CPP Library(STL)라고...
할 수 있습니다. C++ 프로그래밍시 반드시 시스템 or 컴파일러에
의해서 기본적으로 제공되어야 합니다. 추가적으로 MFC도
넣을 수 있습니다.



즉, 윈도우 프로그래밍시 기본적으로 제공되어야 하는 것은
CRT, STL, MFC 라고 할 수 있습니다.

/MD, /MT는 위의 세 라이브러리를 어떤 형식으로 연결시킬 것인지를
나타내는 것입니다.

DLL로 제공할 지, Static Library로 제공할지 여부입니다.
만일 DLL로 제공할 경우 실행 이미지(exe)를 만들 경우 시스템 제공 dll을 사용하므로 크기가 커지지 않을 것이고, Static Library로 사용할 경우 실행 이미지에 관련 기능이 추가되므로 크기가 커질 것입니다.

/MT (Static Library) 에서 다음 정적 라이브러리에 연결됩니다.
CRT - libcmt.lib
STL - libcpmt.lib
MFC - nafxcw.lib

/MD (DLL 연결) 에서는 다음 임포트 라이브러리에 연결됩니다.
CRT - msvcrt.lib (즉, msvcr##.dll 에 연결)
STL - msvcprt.lib (즉, msvcp##.dll 에 연결)
MFC - mfc##.lib, mfcs##.lib (즉, mfc##.dll) - #‪#‎은‬ VS 버전

가끔 /MD, /MT 중 어느것이 좋으냐는 질문을 받곤 하는데요. 경우에 따라서 다릅니다만 저 같은 경우는 /MT를 선호합니다.  /MT를 선택할 경우 실행 바이너리가 커지는 단점이 있긴
하지만 네트워크 환경이 좋은 상태에서 전송에 큰 부담이 없을 뿐 아니라, /MD를 선택할 경우 VS2008 이전 버전까지는  Manifest에 의해서 DLL Hell 문제가 발생하곤 했는데, /MT를 사용할 경우 완전 독립적이기 때문에 안정적이라는 장점이 있습니다.


Facebook C++ Korea 에서 Kim Hwa Su 님의 글에서 담아왔습니다.

댓글 없음:

댓글 쓰기