문제

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

구현의 차이를 이해하지만 어느 것이 사용되어야하는지 아직 확실하지 않습니다. 장단점은 무엇입니까?

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

내가 궁금한 것들 :

  • 이것이 빌드 시간에 어떤 영향을 미칩니 까? (아마도 /mt는 조금 느리게?)
  • 다른 의미는 무엇입니까?
  • 대부분의 사람들이 사용하는 것은 무엇입니까?
도움이 되었습니까?

해결책

/md와 동적으로 연결하여

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

또한 실제로 다른 런타임 옵션으로 구축 된 정적으로 연결된 3 자 바이너리 전용 라이브러리로 작업 할 때 기본 응용 프로그램의 /MT는 /MD보다 훨씬 자주 충돌을 일으키는 경향이 있음을 발견했습니다. 'C 런타임이 정적으로 여러 번, 특히 다른 버전 인 경우 여러 번 정적으로 연결된 경우 문제가 발생합니다.

다른 팁

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

.exe 및 모든 .dlls에 동적 CRT를 사용하면 모두 CRT의 단일 구현을 공유합니다. 즉, 하나의 CRT 힙을 공유하고 하나의 .Exe/.dll에 할당 된 메모리를 공유합니다. 또 다른.

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

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

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

나는 전체 dll 엉망을 무시할 수 있도록 /mt 직접 사용합니다.

PS AS Fooz 씨 지적합니다. 일관성이 있어야합니다. 다른 라이브러리와 링크하는 경우 동일한 옵션을 사용해야합니다. 제 3 자 DLL을 사용하는 경우 DLL 버전의 런타임 라이브러리를 사용해야 할 것입니다.

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

/md를 사용하여 더 작은 실행 파일을 얻지 만 여전히 사용자가 프로그램을 실행하기에 적합한 버전을 얻을 수 있도록 많은 DLL을 배송해야합니다. 그리고 결국, 당신의 설치 프로그램은 /mt와 연결될 때보 다 커질 것입니다.

더 나쁜 것은, 런타임 라이브러리를 Windows 디렉토리에 넣기로 선택한 경우, 조만간 사용자는 다른 라이브러리가있는 새 응용 프로그램을 설치하고 불운으로 응용 프로그램을 중단 할 것입니다.

/md와 함께 실행되는 문제는 CRT의 대상 버전이 사용자 컴퓨터에 있지 않을 수 있다는 것입니다 (특히 최신 버전의 Visual Studio를 사용하는 경우 사용자가 이전 운영 체제를 보유한 경우).

이 경우 컴퓨터에 올바른 버전을 가져 오는 방법을 알아 내야합니다.

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

/mt는 _mt를 정의하여 런타임 루틴의 멀티 스테이드 특이 적 버전이 표준 헤더 (.h) 파일에서 선택되도록 정의합니다. 이 옵션은 또한 컴파일러가 라이브러리 이름 libcmt.lib를 .obj 파일에 배치하여 링커가 libcmt.lib를 사용하여 외부 기호를 해결하도록합니다. 멀티 스레드 프로그램을 만들려면 /mt 또는 /md (또는 그들의 디버그 등가 /mtd 또는 /mdd)가 필요합니다.

/md는 _mt 및 _dll을 정의하여 표준 .h 파일에서 런타임 루틴의 멀티 스레드 및 DLL 특이 적 버전이 모두 선택되도록합니다. 이 옵션은 또한 컴파일러가 라이브러리 이름 msvcrt.lib를 .obj 파일에 배치하게합니다.

이 옵션으로 편집 된 응용 프로그램은 MSVCRT.LIB에 정적으로 연결됩니다. 이 라이브러리는 링커가 외부 참조를 해결할 수있는 코드 레이어를 제공합니다. 실제 작업 코드는 MSVCR71.dll에 포함되어 있으며 MSVCRT.LIB와 연결된 응용 프로그램에 실행 시간에 사용할 수 있어야합니다.

/md가 _static_cpplib 정의 ( /d_static_cpplib)와 함께 사용될 때, 응용 프로그램은 동적 버전 (msvcprt.lib) 대신 정적 멀티 스테이드 표준 C ++ 라이브러리 (libcpmt.lib)와 연결되며 여전히 메인 CRT를 통해 동적으로 연결되어 있습니다. msvcrt.lib.

그래서 내가 올바르게 해석한다면 /산 정적으로 링크 /md 동적으로 연결됩니다.

/MD 옵션보다 다른 DLL 또는 LIB를 사용하는 실행 파일을 구축하는 경우 모든 구성 요소가 동일한 라이브러리를 공유하기 때문에 선호됩니다. 물론이 옵션은 IE DLL/LIB/EXE와 관련된 모든 모듈과 일치해야합니다.

실행 파일이 다른 사람의 전화보다 LIB 또는 DLL을 사용하지 않는 경우. 공유 측면이 작동하지 않기 때문에 차이는 그리 많지 않습니다.

따라서 강력한 이유가 없기 때문에 /mt로 애플리케이션을 시작할 수 있지만 LIB 또는 DLL을 추가 할 때 쉽게 LIB /DLL의 /MD로 변경할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top