2012-08-08 3 views
1
나를 혼란스럽게 두 가지 질문이 있습니다

:을 LoadLibrary MSVCRT 문제

나는 우리가 같은 프로젝트에서 다른 C 런타임을 사용할 수 없습니다 Microsoft 웹 사이트에서 읽을
  1. ./MT 플래그로 컴파일 된 DLL이 있다고 가정하면 컴파일 된 프로젝트/dll에서 DLL을 사용할 수 없습니다. 내 질문은 내가 LoadLibrary()를 사용하여 DLL을로드하는 경우, 그것은 또한 동일한 C 런타임이 필요합니까? 내가하지 않으면 잠재적 인 위험은 무엇입니까?

  2. /MT 플래그를 사용하면 런타임이 정적으로 이진 파일에 링크되어 있다고 생각합니다. 하지만 내 DLL 프로젝트 중 하나에 대해/MT와 함께 DLL을 만들었습니다. 그러나, 나는 dumpbin.exe/dependents mydll 때, MSVCR100.dll이 종속임을 보여줍니다. 내 질문에 DLL은 여전히 ​​MSVCR100.dll에 의존하는 이유는 무엇입니까?

답변

2

1) 아니오, 필수 사항은 아닙니다. 이것은 모든 프로그램에서 발생하며 Windows DLL은 예를 들어 자체 CRT를 사용합니다. 그러나 하나의 프로그램에서 CRT를 혼합하는 것은 매우 위험하며 문제를 진단하기가 매우 어려워 질 수 있습니다. Windows api는 이러한 문제를 피하기 위해 신중하게 설계되었으므로 DLL에 할당 된 메모리를 해제하고 예외를 사용하지 않으며 표준 C++ 라이브러리 클래스를 사용하지 않고 로켈 또는 다른 유형에 의존하지 마십시오 공유 CRT 상태 당신이 섞을 때 잘못되는 종류의 것들. 자신을 C 또는 COM API로 제한하면 이러한 함정을 피할 수 있습니다.

2) 이것은/MD로 컴파일 된 코드를 링크 할 때 발생합니다. .libs와 연결하는 것이 일반적입니다.

프로젝트에 DLL이 있고 정확히 동일한 컴파일러와 옵션을 사용하여 모두 코드를 컴파일하면 항상/MD를 사용하여 문제가 발생하지 않습니다. 자신을 구축하지 않은 정적 라이브러리는 매우 번거롭고 피할 수 있습니다.

1

2. 귀하의 질문과 관련하여 의존성은 간접적입니다. DLL은 MSVCR100.dll에 의존하는 DLL을 사용합니다. Dependency walker을 사용하면 구성 요소의 종속성 트리를보고 어떤 라이브러리가 직접 및 간접적으로 종속되는지 확인할 수 있습니다.