2009-04-24 6 views
17

Visual Studio 프로젝트에서 C 런타임 라이브러리에 정적으로 또는 동적으로 링크해야하는지 여부에 대한 인수를 읽었으며 여전히 생각할 부분이 전적으로 충분하지 않습니다.정적 또는 동적으로 Visual Studio C 런타임에 연결해야합니까?

내 프로젝트는 제 3 자 라이브러리 (Python, HDF5, Trilinos 및 Microsoft MPI)를 가져옵니다. 각 라이브러리는 최종 실행 파일과 동일한 런타임 라이브러리로 빌드해야합니다. 그렇지 않으면 함께 링크 할 수 없습니다. 정적으로 링크 할 때, 이들 라이브러리 각각은 C 런타임의 사본을 포함합니다. 최종 실행 파일에는 런타임의 여러 복사본이 포함되어 있으므로 어느 것도 서로 상호 작용할 수 없으므로 문제가 발생할 수 있습니다. 그러나 동일한 기호가 여러 개 정의 된 경우 링커가 불평하지 않겠습니까?

저는 "DLL Hell"을 피하고 싶지만 런타임의 여러 복사본에 정적으로 링크 할 때 발생할 수있는 교활한 오류에 대해 걱정하고 있습니다. 내가 잘못 읽은거야?

또한 Visual Studio 2005를 사용하고 있으며 서비스 팩 1 런타임은 역 호환되지 않는다고 읽었습니다. 이것은 SP1이없는 응용 프로그램이 SP1 DLL이있는 컴퓨터에서 실행되지 않는다는 것을 의미합니까 (예 : msvcr80.dll)?

답변

23

정적으로 링크하면 모든 EXE와 DLL이 부풀어 오를 수 있습니다 (예 : 한 DLL의 코드가 다른 DLL의 malloc()이 할당 한 포인터로 free()를 호출하면 충돌이 발생할 수 있음).

동적으로 링크하고 런타임 DLL을 개인 어셈블리로 배포하면 두 가지 장점을 모두 활용할 수 있습니다. 이것은 런타임 DLL과 그 매니페스트를 포함하는 특별히 명명 된 디렉토리의 사본을 실행 파일 옆에 두는 것을 의미합니다.

세부 사항에 대한 http://msdn.microsoft.com/en-us/library/ms235291(VS.80).aspx에 대해서는 "배포 비주얼 C++ 개인 어셈블리와 같은 라이브러리 DLL을"볼 수 있지만, 기본적으로 응용 프로그램은 다음과 같습니다 : 마지막 질문으로

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 

, 그래, 대상 컴퓨터가 필요로하는 올바른 버전의 런타임 DLL을 비공개 어셈블리로 배포함으로써이를 보장합니다.

또 다른 이점은 관리자가 아닌 사용자가 프로그램 파일이 아닌 다른 곳으로 앱을 설치할 수 있다는 것입니다. WinSxS 영역에 파일을 쓸 수있는 권한이 필요하지 않습니다.

+0

이것은 내가 찾고 있던 대답이다. 사적인 어셈블리가 내 문제에 대한 가장 안전한 해결책 인 것처럼 보입니다. 앱이 고정 된 디렉토리 구조로 배포된다는 점에서 Mac 번들을 생각 나게합니다. 감사! – user76293

+6

그러나 개인 어셈블리는 Windows Update에 의해 패치되지 않습니다. 맞습니까? 따라서 런타임 라이브러리 복사본을 최신 상태로 유지해야합니다. 또한 http://blogs.msdn.com/larryosterman/archive/2004/04/29/123090.aspx –

+0

내 '응용 프로그램'(내 응용 프로그램) 폴더에 32 비트 및 64 비트 응용 프로그램을 지원합니다. 단순히 어셈블리 폴더 이름에 x32 또는 x64와 같은 것을 추가 할 수 없습니다. 즉, 32 비트 또는 64 비트 응용 프로그램 만있는 경우 전용 어셈블리 만 사용할 수 있습니다. – Patrick

0

정적 라이브러리는 다른 정적 라이브러리에 정적으로 링크 할 필요가 없습니다. 주 프로젝트의 모든 정적 라이브러리 만 연결하면됩니다. 그런 식으로 컴파일러는 여러 기호에 대해 불평하지 않습니다.

+0

명확히하기 : 라이브러리를 서로 연결하지 않고 주 실행 파일을 링크 할 때 다중 정의 기호를 얻지 못합니다. 하지만 C 런타임의 여러 복사본이 내 실행 파일에 있는지 여부를 확신 할 수 없습니다.이 런타임은 정적으로 링크 할 때 발생합니다 (잘못 읽은 것의 해석에 따라). – user76293

2

... 정적으로 수행 할 것인가 ... DLL 지옥을 수정하려고 시도했지만 제대로 작동하지 않았습니다. 설치에 정적 연결을 추가하기 만하면됩니다.

+0

런타임의 여러 복사본에 대한 의견이 있으십니까? 그게 내 진짜 질문이야. – user76293

+0

어쨌든 주위에 부동 런타임 복사본이 여러 개 있습니다. 이것이 WinSxS 폴더가있는 것입니다 (DLL 지옥을 고치는 시도입니다). 혼란 스럽긴하지만, 자신의 런타임을 패키징하는 것은 그런 문제를 피할 것입니다. – CookieOfFortune

11

런타임의 여러 복사본을 얻을 수있는 유일한 시간은 라이브러리를 DLL에 정적으로 연결할 때입니다. 각 DLL에 복사본이 생기고 exe도 복사됩니다. DLL이 아닌 의 모든 정적 라이브러리 인 경우, 모두 연결되어 모든 라이브러리가 동일한 런타임을 공유합니다.

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

관련 문제