문제

프로그램 실행 파일과 함께 MSVCRT (또는보다 현재 동등한)에 번들로 묶는 Windows 프로그램을 자주 겪습니다. 일반적인 PC에서는 같은 .dll의 많은 사본을 찾을 수 있습니다. 내 이해는 msvcrt가 C 런타임 라이브러리이며 *nix 아래에 glibc/libc.so와 다소 유사하다는 것입니다.

Windows 프로그램이 시스템 전체 LIBC를 공유하는 대신 C 라이브러리를 가져와야하는 이유는 무엇입니까?


업데이트 : SHOG9 덕분에 SXS에 대해 읽기 시작했는데 DLL Linkage 문제 (DLL Hell)에 대한 눈을 더욱 열어주었습니다. http://blogs.msdn.com/b/martynl/archive/2005/10/13/480880.aspx 문제에 대한 유용한 소개입니다 ...

도움이 되었습니까?

해결책

저는 Microsoft의 Native SXS 기술의 현재 관리자입니다

새로운 버전의 MSVCRT는 새로운 버전의 Visual Studio와 함께 출시되며 C ++ 도구 세트의 변경 사항을 반영합니다. 따라서 특정 버전의 Windows가 계속 된 후 릴리스 버전으로 컴파일 된 프로그램은 다운 레벨 (예 : Windows XP의 VS 2008 프로젝트)이 작동 할 수 있으므로 MSVCRT는 재분배 할 수 있으므로 설치할 수 있습니다.

CRT 설치는 라이브러리를 %windir % winsxs 로 삭제합니다. 이는 글로벌 시스템 위치 인 관리자 권한이 필요합니다.

일부 프로그램은 설치 프로그램과 함께 배송하기를 원하지 않거나 사용자가 설치 프로그램을 실행하기 위해 컴퓨터의 관리자 권한이 필요하지 않기 때문에 개인 용도로 CRT를 응용 프로그램과 동일한 디렉토리에 직접 번들로 묶습니다. 따라서 일반적인 기계에서는이 솔루션을 선택한 많은 프로그램을 찾을 수 있습니다.

다른 팁

Windows에는 실제로 "시스템 전체 LIBC"가 없습니다.

*nix에는 일반적으로 하나의 컴파일러, 하나의 링커 및 잘 정의 된 객체 파일 형식, 호출 규칙 및 이름 Mangling Spec가 있습니다. 이 물건은 일반적으로 OS와 함께 제공됩니다. 컴파일러의 반 전문적 상태 (다른 *닉스의 휴대성에 중점을두면 특정 물건이 될 수 있음을 의미합니다. 예상되는 그곳에 있고 프로그램이 쉽게 찾아서 사용할 수있는 방식으로 지명 및/또는 버전을 사용합니다.

창문에서는 물건이 더 조각화되어 있습니다. 컴파일러는 OS와 함께 제공되지 않으므로 사람들은 자신의 직접 얻어야합니다. 각 컴파일러는 자체 CRT를 제공하며 MSVCRT와 동일한 기능을 가질 수도 있고 아닐 수도 있습니다. 컨벤션을 호출하거나 라이브러리에 이름이 나타나야하는 방법에 대한 진정한 사양도 없으므로 다양한 컴파일러 (다른 방법으로)가 라이브러리에서 함수를 찾는 데 어려움이있을 수 있습니다.

BTW, 이름은 여기서 단서가되어야합니다. MSVCRT는 "Microsoft Visual C ++ 런타임"의 경우 짧습니다. 실제로는 "시스템 전체"라이브러리가 아닙니다. kernel32 IS - MS의 컴파일러가 사용하는 런타임 라이브러리 일뿐입니다. 다른 컴파일러는 상상할 수 없을 수도 있지만 (1) 라이센스 문제가있을 수 있습니다. (2) 컴파일러는 코드를 MS에 묶는 것입니다. 의미 (2A) 더 이상 런타임에 추가하거나 버그를 수정할 수있는 방법이 없으며 MS가 수정되기를 바라고 있습니다. 그리고 (2B) MS가 RTL의 내용을 변경하기로 결정한 경우 (마음대로 할 수 있고, 각각의 새로운 버전의 VC ++에 가질 수 있음), 이름이 어떻게 나타나는지, 다른 프로그램이 깨질 수 있습니다.

짧은 대답? SXS까지 MSVCRT 안정적으로 버전이 없었습니다! LIBC 5에 대해 프로그램이 수집되고 테스트 된 프로그램이 LIBC 6을 조용히 사용하기 시작하면 결과가 발생할 광기를 상상할 수 있습니까? 그것이 우리가 창문에서 수년 동안 있었던 상황입니다. 우리 대부분은 버전에서 변경 사항을 계속 유지하면서 MS를 다시 신뢰하지 않을 것입니다.

프로그램은 런타임의 특정 버전과 연결되어 있으며 필요한 버전은 다음과 같습니다. ~ 아니다 대상 기계에 존재하도록 보장됩니다. 또한 일치하는 버전은 문제가되었습니다.

Windows World에서는 사용자가 응용 프로그램을 사용하기 위해 별도의 라이브러리를 찾아서 설치할 것으로 기대하는 것은 매우 나쁜 태도입니다. 호스트 시스템의 일부가 아닌 종속성이 앱에 포함되어 있는지 확인하십시오.

Linux 세계에서는 호스트 시스템의 모습에 훨씬 더 큰 변형이 있기 때문에 항상 간단하지는 않습니다.

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