/ MD 또는 / MT로 컴파일해야합니까?


126

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

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

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

내가 궁금한 것들 :

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

1
자세한 정보 및 제안은 stackoverflow.com/questions/787216
Weidenrinde에서

답변:


85

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

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

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


10
시스템 업데이트 비트는 SxS에 의해 다소 줄어 듭니다. EXE는 원하는 CRT 버전을 선언하게됩니다 (보안 업데이트가이를
무시할 수 있음

1
이것은 MD를 사용하여 컴파일하고 내 프로그램이 일부 dll에 의존하는 경우 종속성 dll이 존재하지 않는 컴퓨터에서 프로그램을 실행하면 프로그램이 실패한다는 것을 의미합니까?
gerrytan

5
@gerrytan : 예, 소프트웨어를 실행하려는 모든 컴퓨터에 사용중인 적절한 DLL이 있는지 확인해야합니다. 이에 대한 일반적인 해결책은 사용자가 적절한 MSVC 재배포 가능 패키지를 설치하거나 모든 작업을 수행하는 설치 관리자를 사용하는 것입니다.
Mr Fooz

@Royi 확실 /MT하지 않지만 앱이 매번 런타임 함수의 구현을 검색 할 필요가 없기 때문에 런타임에 약간 더 빠를 것이라고 생각 합니다.이 수준의 전문가는 아니지만 대부분은 확신합니다. OS는 런타임 구현을 캐시하므로 앱이 캐시 된 버전을 사용하므로 차이점은 그다지 멀지 않습니다. 확실하지 않다고 언급 했으므로이 의견을 인수로 사용하지 마십시오.
Ahmed Kamal

34

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

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

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


20

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

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

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

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


14

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

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

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


5
"런타임 라이브러리를 windows 디렉토리에 넣는 것"은 매우 나쁜 생각입니다. 이전과 동일했던 다른 어리석은 응용 프로그램을 중단 할 수 있습니다. SxS를 사용하여 설치 관리자가 처리하게하거나 / MT를 사용하십시오.
MSalters

1
나는 그것이 나쁜 생각이라는 것에 전적으로 동의합니다. 어떤 사람들은 그렇게하지만 왜 이것이 좋은 생각이 아닌지 설명하고있었습니다.
Adrian Grigore

@AdrianGrigore 왜 다른 라이브러리를 가진 새로운 응용 프로그램으로 인해 응용 프로그램이 중단됩니까? / MD 연계를 사용한다면 새 버전의 라이브러리를로드하기 시작했을까요?
rturrado

4
@rturrado : 별로는 아닙니다. 위에 다른 응용 프로그램을 설치하면 dll을 이전 버전으로 덮어 쓸 수 있습니다. 최신 버전은 사라질 것입니다. 이것은 일반적으로 "DLL 지옥"로 알려져 참조 en.wikipedia.org/wiki/DLL_Hell
아드리안 고르

1
Microsoft는 Visual Studio 2010에서 WinSxS를 포기했습니다. 이제 런타임 라이브러리는 개인 또는 system32 ( msdn.microsoft.com/en-us/library/vstudio/dd293574.aspx ) 에 배포 됩니다.
BCran

8

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

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


7

에서 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 는 동적으로 링크됩니다.


문제는 "어떤 것을 사용해야합니까?"였습니다. 이것은 답이 아닙니다.
레너드 잉크 렛

1

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.