Visual Studio C 런타임에 정적으로 또는 동적으로 링크해야합니까?

StackOverflow https://stackoverflow.com/questions/787216

  •  16-09-2019
  •  | 
  •  

문제

비주얼 스튜디오 프로젝트에서 C 런타임 라이브러리에 정적으로 또는 동적으로 연결되어야하는지에 대한 인수를 읽었으며 여전히 어떻게 생각 해야할지 확실하지 않습니다.

내 프로젝트는 일부 타사 라이브러리 (Python, HDF5, Trilinos 및 Microsoft MPI)를 가져 오는데, 각각은 최종 실행 파일과 동일한 런타임 라이브러리로 구축해야합니다 (그렇지 않으면 함께 연결할 수 없습니다). 정적으로 링크 할 때 각 라이브러리에는 C 런타임 사본이 포함됩니다. 나는 이것이 최종 실행 파일에 런타임의 여러 사본이 포함되어 있기 때문에 문제를 일으킬 책임이 있다는 것을 읽었으며, 그 중 어느 것도 서로 상호 작용할 수 없습니다. 그러나 동일한 기호가 곱하기 정의 된 경우 링커가 불만을 제기하지 않습니까?

"DLL Hell"을 피하고 싶지만 런타임의 여러 사본에 정적으로 연결되어 발생할 수있는 교활한 오류가 걱정됩니다. 내가 잘못 읽고 있습니까?

또한 Visual Studio 2005를 사용하고 있으며 Service Pack 1 런타임이 뒤로 호환되지 않는다는 것을 읽었습니다. 이것은 SP1없이 구축 된 앱이 동일한 이름 (예 : MSVCR80.dll)이 있더라도 SP1 DLL이있는 컴퓨터에서 실행되지 않음을 의미합니까?

도움이 되었습니까?

해결책

정적으로 연결하면 모든 exes와 dlls가 팽창하고 다른 dll에서 malloc ()에 의해 포인터가 할당 된 상태에서 하나의 dll이 free ()를 호출하는 경우 충돌을 일으킬 수 있습니다.

동적으로 연결하고 런타임 DLL을 개인 어셈블리로 배포하여 두 세계를 최대한 활용할 수 있습니다. 이는 단순히 런타임 DLLS와 실행 파일 옆에 매니페스트가 포함 된 특별한 이름 디렉토리의 사본을 넣는 것을 의미합니다.

"Visual C ++ 라이브러리 DLL을 개인 어셈블리로 배포"하는 섹션을 참조하십시오. http://msdn.microsoft.com/en-us/library/ms235291(vs.80).aspx 자세한 내용은 기본적으로 응용 프로그램이 다음과 같습니다.

c:\Program Files\My App\MyApp.exe
c:\Program Files\My App\MyLibrary.dll
c:\Program Files\My App\Microsoft.VC80.CRT\Microsoft.VC80.CRT.manifest
c:\Program Files\My App\Microsoft.VC80.CRT\msvcr80.dll

마지막 질문에 관해서는, 대상 머신에는 올바른 런타임 DLLS가 작동해야하지만 개인 어셈블리로 배포함으로써이를 보장합니다.

또 다른 이점은 Admin이 아닌 사용자가 앱을 설치할 수 있다는 것입니다 (프로그램 파일이 아니라 다른 곳) - Winsxs 영역에 파일을 작성할 권한이 필요하지 않습니다.

다른 팁

런타임의 여러 사본을 얻을 수있는 유일한 시간은 라이브러리를 DLL에 정적으로 연결하는 것입니다. 만약 그렇다면 모두 DLL이 아닌 정적 라이브러리는 모두 함께 연결되며 모든 라이브러리는 동일한 런타임을 공유합니다.

그것이 링커의 작업입니다.

... 정적으로 ... DLL 지옥을 고치려고 시도하는 것은 잘 작동하지 않았습니다 ... 정적 링키지를 사용하여 설치에 추가로 200k를 추가하십시오.

정적 라이브러리는 다른 정적 라이브러리에 정적으로 연결될 필요가 없습니다. 메인 프로젝트의 모든 정적 라이브러리 만 연결하면됩니다. 이렇게하면 컴파일러가 여러 기호에 대해 불평하지 않습니다.

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