2009-10-13 4 views
1

다른 컴퓨터에서 프로젝트를 작성하고 실행하는 데 이상한 문제가 있습니다. 이것은 병존 오류입니다. 일반적으로 C++ 재배포 가능 파일이 기계 등에 설치되어 있지 않기 때문에 발생합니다. 그러나이 경우 프로젝트는 해당 시스템에서 컴파일됩니다. MSVC++ 2005가 설치되어 있으면 런타임이 있어야합니다 (어쨌든 좋은 측정을 위해 런타임을 다시 설치했습니다). 링커가 시스템에서 사용할 수없는 런타임 라이브러리를 참조하는 이유는 무엇입니까?MSVC++ 2005가 설치된 다른 컴퓨터에서 SideBySide 오류가 발생했습니다.

저는 런타임 라이브러리에 동적으로 연결됩니다.

이 문제를 디버깅하는 방법에 대한 아이디어가 있으십니까?

감사합니다.

편집

내가이 관련이 있기 때문에 다른 게시물을 시작하고 싶지 않았다. 이 DLL 버전이 엉망이기 때문에 런타임에 정적으로 링크하는 것이 좋은 이유입니까? 이러한 모든 문제를 피할 수 있습니까? 더 이상 런타임에 동적으로 링크하는 데 어떤 이점도 보이지 않습니다. 나는 DLL 런타임에서 새로운 DLL로 업데이트/버그 수정의 이점을 얻는다는 인상을 받았다. 그러나 SxS와 매니페스트 때문에 특정 버전 (이전 버전)의 DLL을로드한다는 것을 보장합니다. 그렇다면 동적 런타임의 핵심은 무엇입니까? 모든 의존 라이브러리에 재사용 기능을 내장하지 않아서 몇 킬로 비트의 공간이 절약 될 수 있습니다. 그러나 일부 고대 런타임 버전이 시스템에서 제거 되었기 때문에이 비용을 앱의 비용과 비교해 볼 가치가 있지 않습니까?

다시 한번 감사드립니다. 여전히 원래의 문제를 추적하고 아마도 내가 사용하고있는 모든 단일 라이브러리를 다시 컴파일해야 할 것입니다.

답변

5

sxstrace은 SxS와 관련하여 무슨 일이 일어나는지 정확하게 알려줍니다. 그것은 dll이 검색되는 방법과 실제 버전에 매핑되는 방법을 보여줍니다.

이제 런타임은 프로젝트에 포함 된 매니페스트 파일에서로드됩니다. 언급 한 것을 보면 Visual2005의 서비스 팩이없는 것처럼 보입니다. SXS 반드시 당신이 매니페스트 안에 지정 버전을로드 할 수 없습니다 : 당신은 내 대답에 답을 추가 할 수 있도록, 귀하의 질문에 질문을 추가하기 때문에 SP1은 8.0.50727.762

Some details on sxstrace on vista and XP

음에 CRT 변경 . SxS 시스템은 특정 버전에 대한 보안 수정 사항을 추적합니다 (예 : 특정 버전을 요구할 때도 어떤 버전으로로드 할지를 변경합니다.

즉, 프로그램에서 DLL을 사용하고 그 사이에 C 객체 (예 : malloc'ed memory)를 공유하려는 경우 CRT DLL 만 사용할 수 있습니다. 그것은 당신의 제약이 무엇인지에 달려 있습니다.

+0

8.0.50608.0은 c : \ windows \ WinSxS 폴더에서 찾을 수없는 파일입니다. 고마워, sxstrace에 대해 몰랐다. – Budric

+0

SP1을 설치 했습니까? – Bahbar

1

하지 문제에 대한 답하지만,이 질문에 대한 답 :

왜 링커가 컴퓨터에 사용할 수없는 런타임 라이브러리를 참조하고?

링커는 링크하기 위해 실제 런타임 라이브러리가 필요하지 않습니다. 링크 할 때 .lib 파일이 필요합니다 (일반적으로). .lib 파일은 OS가 런타임에 dll을 찾을 때 런타임 라이브러리가 제공하는 링커 (내 보낸 심볼에서와 같이)에게 링커에게 알려줍니다.

Dependency Walker은 문제를 디버그하는 데 도움이 될 수 있습니다.

편집 : 새 질문을 따르십시오. 정적 링크는 이러한 문제를 해결하지만 몇 가지 새로운 문제도 제기합니다. dll 사이에 동적으로 할당 된 객체를 공유 할 수 있습니다. 그러나 할당 된 dll은 객체를 할당 해제해야합니다. 마찬가지로 힙 손상을 피하기 위해 비슷하게 멤버 데이터/객체를 할당/재 할당/할당 취소하는 객체의 모든 메소드를 관리해야합니다. 비 인라인 refcounting/shared 포인터가 도움이 될 것입니다. 또는 shared mem allocators도 도움이 될 수 있습니다.

+0

본 적이 있습니다. 나는 name = "Microsoft.VC80.DebugCRT"version = "8.0.50608.0"또는 "manifest generator"를 사용하고 링커가 매니 페스트를 포함하기로 결정한 링커인지 확실치 않습니다 ... 매우 혼란 스럽습니다. – Budric

+0

VC 런타임의 디버그 버전은 배포 할 수 없습니다. 릴리스 빌드를 수행하면 문제가 발생합니까? –

+0

예, 릴리스 및 디버그 모두. 앞에서 언급했듯이 전체 MSVC가 설치되어 있으므로 프로젝트를 빌드/정리하고 있습니다. 프로젝트가 정적으로 다른 라이브러리 (예 : Poco)에 연결됩니다. 이러한 라이브러리는 런타임에 동적으로 연결됩니다. 이게 문제 야? 그렇다면 코드 하나 하나를 다시 빌드하지 않고도 1 대 이상의 컴퓨터에서 어떻게 개발할 수 있는지 알 수 없습니다. – Budric

1

타사 라이브러리 또는 개체 파일을 사용하여 컴파일 한 후 다른 컴퓨터에서 컴파일 한 후 문제가 발생한 컴퓨터에서 복사 할 때 발생할 수 있습니다.

컴퓨터에서 이러한 이진 파일을 찾아서 해당 컴퓨터에서 다시 컴파일 해보십시오.

0

여기는 possibly related forum post입니다. 이것이 문제인지 확실하지는 않지만 확인할 가치가 있습니다.

요약하면 자동 업데이트를 통해 VS 2005 개발자 컴퓨터에서 ATL, CRT, MFC 및 기타 다른 라이브러리를 업데이트 한 것입니다.

VS2005가 설치되지 않은 컴퓨터에서는 자동 업데이트를 통해 ATL 만 업데이트되어 SxS 오류가 발생했습니다.

dev 컴퓨터에서 업데이트를 제거하거나 실행하려고하는 컴퓨터에서 런타임을 수동으로 업그레이드 할 수 있습니다. post에 대한 세부 정보