/ MD 또는 / MT로 컴파일해야합니까? 선택할 수

Visual Studio에는 컴파일 플래그 / MD 및 / MT가 있으며 원하는 C 런타임 라이브러리 종류를 선택할 수 있습니다.

구현의 차이점을 이해하지만 여전히 어느 것을 사용 해야할지 모르겠습니다. 장단점은 무엇입니까?

내가 들었던 / MD의 한 가지 장점은 누군가가 런타임을 업데이트하고 (보안 문제를 패치 할 수 있음) 내 앱이이 업데이트의 혜택을받을 수 있다는 것입니다. 나에게 이것은 거의 특징이 아닌 것 같습니다. 새 버전에 대해 테스트하지 않고 사람들이 런타임을 변경하는 것을 원하지 않습니다!

내가 궁금한 것들 :

  • 이것이 빌드 시간에 어떤 영향을 미칩니 까? (아마도 / MT는 조금 느려 집니까?)
  • 다른 의미는 무엇입니까?
  • 대부분의 사람들이 어느 것을 사용합니까?


답변

/ MD와 동적으로 연결함으로써

  • 시스템 업데이트 (좋은 또는 나쁜)에 노출 된 경우
  • 실행 파일은 더 작을 수 있습니다 (라이브러리가 포함되어 있지 않기 때문에).
  • 최소한 DLL의 코드 세그먼트는 적극적으로 DLL을 사용하는 모든 프로세스간에 공유된다고 생각합니다 (소비 된 총 RAM 양 감소).

또한 실제로 다른 런타임 옵션으로 빌드 된 정적으로 링크 된 타사 바이너리 전용 라이브러리로 작업 할 때 주 응용 프로그램의 / MT는 / MD보다 훨씬 더 자주 충돌을 일으키는 경향이 있음을 알았습니다. C 런타임이 여러 번 정적으로 링크되면 (특히 버전이 다른 경우) 문제가 발생할 수 있습니다.


답변

DLL을 사용하는 경우 동적으로 연결된 CRT (/ MD)를 사용해야합니다.

.exe 및 모든 .dll에 동적 CRT를 사용하는 경우 모두 단일 CRT 구현을 공유합니다. 즉, 하나의 .exe / .dll에 할당 된 단일 CRT 힙 및 메모리를 모두 공유 할 수 있습니다. 다른.

.exe 및 모든 .dll에 정적 CRT를 사용하는 경우 모두 별도의 CRT 사본을 얻게됩니다. 즉, 모두 자체 CRT 힙을 사용하므로 동일한 모듈에서 메모리를 비워야합니다. 할당되었습니다. 또한 코드 팽창 (CRT의 다중 사본) 및 과도한 런타임 오버 헤드 (각 힙이 OS의 메모리를 할당하여 상태를 추적하고 오버 헤드를 눈에 띄게 할 수 있음)가 발생합니다.


답변

Visual Studio를 통해 빌드 된 프로젝트의 기본값은 / MD라고 생각합니다.

/ MT를 사용하는 경우 실행 파일은 대상 시스템에 존재하는 DLL에 의존하지 않습니다. 이것을 설치 프로그램으로 포장하는 경우 문제가되지 않으며 어느 쪽이든 갈 수 있습니다.

/ MT를 직접 사용하므로 전체 DLL 혼란을 무시할 수 있습니다.

추신 : Fooz 씨가 지적했듯이 일관성을 유지하는 것이 중요합니다. 다른 라이브러리와 연결하는 경우 동일한 옵션을 사용해야합니다. 타사 DLL을 사용하는 경우 런타임 버전의 DLL 버전을 사용해야합니다.


답변

/ MT와 정적으로 연결하는 것을 선호합니다.

/ MD로 더 작은 실행 파일을 얻더라도 사용자가 프로그램을 실행하기에 적합한 버전을 얻도록하려면 많은 DLL을 제공해야합니다. 그리고 결국 / MT와 연결할 때보 다 설치 프로그램이 더 커집니다.

더 나쁜 것은 런타임 라이브러리를 windows 디렉토리에 배치하기로 선택하면 조만간 다른 라이브러리로 새 응용 프로그램을 설치하고 불행히도 응용 프로그램을 중단하게됩니다.


답변

/ MD에서 발생할 수있는 문제는 CRT의 대상 버전이 사용자 컴퓨터에 없을 수 있다는 것입니다 (특히 최신 버전의 Visual Studio를 사용하고 있고 사용자에게 이전 운영 체제가있는 경우).

이 경우 시스템에 올바른 버전을 얻는 방법을 알아야합니다.


답변

에서 http://msdn.microsoft.com/en-us/library/2kzt1wy3(VS.71).aspx :

/ MT 표준 스레드 (.h) 파일에서 다중 스레드 특정 버전의 런타임 루틴이 선택되도록 _MT를 정의합니다. 이 옵션을 사용하면 링커에서 LIBCMT.lib를 사용하여 외부 심볼을 ​​확인할 수 있도록 컴파일러에서 라이브러리 이름 LIBCMT.lib를 .obj 파일에 배치합니다. 다중 스레드 프로그램을 작성하려면 / MT 또는 / MD (또는 해당 디버그 / MTd 또는 / MDd)가 필요합니다.

/ MD _MT 및 _DLL을 정의하여 멀티 스레드 및 DLL 관련 런타임 루틴 버전이 표준 .h 파일에서 선택되도록합니다. 이 옵션은 또한 컴파일러가 라이브러리 이름 MSVCRT.lib를 .obj 파일에 배치하게합니다.

이 옵션으로 컴파일 된 응용 프로그램은 MSVCRT.lib에 정적으로 연결됩니다. 이 라이브러리는 링커가 외부 참조를 확인할 수있는 코드 계층을 제공합니다. 실제 작업 코드는 MSVCR71.DLL에 포함되어 있으며 런타임시 MSVCRT.lib와 연결된 응용 프로그램에서 사용할 수 있어야합니다.

/ MD를 _STATIC_CPPLIB 정의 (/ D_STATIC_CPPLIB)와 함께 사용하면 응용 프로그램이 동적 버전 (msvcprt.lib) 대신 정적 멀티 스레드 표준 C ++ 라이브러리 (libcpmt.lib)와 링크되는 동안 계속해서 주 CRT에 동적으로 링크됩니다 msvcrt.lib.

따라서 올바르게 해석하면 / MT 는 정적으로 링크되고 / MD 는 동적으로 링크됩니다.


답변

/ MD 옵션 이외의 다른 dll 또는 lib를 사용하는 실행 파일을 빌드하는 경우 모든 구성 요소가 동일한 라이브러리를 공유하므로 선호됩니다. 물론이 옵션은 관련된 모든 모듈, 즉 dll / lib / exe와 일치해야합니다.

실행 파일이 다른 사람의 호출보다 lib 또는 dll을 사용하지 않는 경우. 공유 측면이 작동하지 않기 때문에 지금 차이는 그리 크지 않습니다.

따라서 특별한 이유가 없기 때문에 / MT로 응용 프로그램을 시작할 수는 있지만 lib 또는 dll을 추가 할 때 lib / dll의 이름으로 쉽게 / MD로 변경할 수 있습니다.