2010-05-31 3 views
2

저는 하나의 실행 파일만으로 이루어진 매우 작은 윈도우 어플리케이션을 만들고 있습니다. 프로그램이 SD 카드에 상주 할 것이므로 응용 프로그램을 최대한 자주 포함하고 싶습니다. 설치 프로그램이 필요 없습니다. 나는 사용자가 단순히 SD 카드에 실행 파일을 복사 할 수 있고 여분의 것을 가지고 놀지 않고 곧바로 실행할 수 있기를 바랄 것이다. 그런 다음 문제는 내 프로그램이 VS 2008 버전으로 컴파일된다는 사실이됩니다.이 버전은 설치가 보장되지 않는 CRT 버전이 필요합니다. 나는 CRT에 정적으로 링크하고 있는데, 나는이 문제를 우회하는 것으로 잘못 생각했다. 나는 몇 가지 오래된 VS 버전을 추적 생각했지만,이 잘못된 경로라고 생각합니다. 나는 창문 xp 이상을 새로 설치하는 프로그램을 실행하고 싶다. 어떤 도움 주셔서 감사설치자없이 배치

.

+0

그래서 다른 라이브러리를 사용하고 계십니까? 언어 런타임에 정적으로 링크하는 경우에는 언어 라이브러리와 번들로 묶을 필요가 없습니다. 그렇다면 다른 의존성은 무엇입니까? – jalf

+0

런타임을 정적으로 연결하면 * 문제가 발생하지 않습니다. 런타임이 여전히 동적으로 링크되는 이유를 추적해야합니다. –

답변

3

/MT 또는 /MTd (디버그 용)을 사용하여 CRT에 정적으로 연결하면 필요한 것을 정확히 수행해야합니다.

동적 라이브러리에 의존하는 무언가가 남아 있다는 사실을 암시하지 않는다는 사실. 정적 CRT로 컴파일되지 않은 추가 DLL이있는 경우에도 마찬가지입니다.

dependency walker (depends.exe)을 사용하여 동적 CRT 또는 다른 DLL에 의존하는 DLL을 정확히 알 수 있습니다.

또 다른 방법은 디버거에서 exe를 실행하고 출력 창에로드중인 DLL을 확인하는 것입니다. 어떤 depends.exe는 시작시로드 된 dll 만 제공하므로 런타임에만로드되는 몇 가지 추가 종속성을 제공 할 수 있습니다.

+0

아쉽게도 종속성 워크 또는 디버거 메서드로는 충분하지 않습니다. CRT 라이브러리가 동적으로로드되면 일부 검사가 수행됩니다. 어셈블리 매니페스트 파일이 있어야하고 어셈블리의 모든 멤버가 존재하는지 (실제로 필요한지 여부에 관계없이) 또는 "런타임이 비정상적으로 종료되도록 요청되었습니다"와 같은 오류가 발생해야합니다. –

+0

매니페스트를 EXE 파일에 포함 할 수 없습니까? Visual Studio의 기본 설정이 아닙니까? – AshleysBrain

+0

@AshleysBrain : 가능합니다. 기본적으로 EXE의 매니페스트가 CRT 어셈블리를 참조하면 매니페스트를 포함하여 어셈블리가 존재하고 완료되어야하며 CRT 어셈블리 매니페스트는 VS2005 및 VS2008의 외부 매니페스트입니다. –

1

CRT 라이브러리의 DLL 버전에 대한 링크를 원한다면 아무 것도 설치하지 않으려면 CRT 어셈블리의 모든 구성원을 실행 파일과 동일한 폴더에 복사해야합니다. 마이크로 소프트가 당신을 밀어 붙이는 방식이 아닐지도 모르지만 그것은 유효하며 작동합니다.

Visual Studio 2008 설치 디렉터리에 VC\redist\x86\Microsoft.VC90.CRT 폴더를 찾아야합니다. 매니페스트 파일을 포함한 해당 폴더의 전체 내용을 실행 파일과 동일한 디렉터리에 복사하면 해당 위치에서 실행 파일을 실행할 수 있어야합니다.

관련 문제