문제

Visual C(++)/Visual Studio를 사용하여 작성하고 컴파일한 내 C(++) 프로그램은 내 컴퓨터에서는 제대로 실행되지만 다른 컴퓨터에서는 실행되지 않습니다.내가 받은 오류 메시지는 "애플리케이션 구성이 잘못되어 이 애플리케이션을 시작하지 못했습니다.응용 프로그램을 다시 설치하면 이 문제가 해결될 수도 있습니다."

도움이 되었습니까?

해결책

C++ 프로그램을 작성하면 C 런타임 라이브러리(CRT)에 동적으로 연결됩니다.이 라이브러리에는 printf, malloc, strtok 등이 포함되어 있습니다.라이브러리는 MSVCR80.DLL이라는 파일에 포함되어 있습니다.이 파일은 Windows 시스템에 기본적으로 설치되어 있지 않으므로 응용 프로그램을 실행할 수 없습니다.

해결책?VCREDIST.EXE(Visual C++ 재배포 가능 패키지)를 통해 대상 컴퓨터에 DLL을 설치하거나 CRT에 정적으로 연결합니다(사용된 함수의 실제 코드를 EXE에 직접 연결).

간단한 애플리케이션과 함께 VCREDIST를 배포하고 설치하는 것은 정말 번거로운 작업이므로 두 번째 옵션을 선택했습니다.정적 연결.정말 쉽습니다:프로젝트 속성으로 이동하여 C/C++를 펼치고 코드 생성을 클릭한 다음 런타임 라이브러리를 비 DLL 옵션 중 하나로 설정합니다.그게 전부입니다.

다른 팁

여기서 문제는 CRT(C 런타임 라이브러리)와 같은 DLL 종속성이 누락되었다는 것입니다.이런 종류의 문제를 진단하기 위한 좋은 도구는 다음에서 찾을 수 있는 종속성 워커(dependent Walker)(dependents.exe)입니다.

http://www.dependentwalker.com/

게시한 오류 메시지를 생성하는 컴퓨터에서 이 프로그램을 실행하고 이를 사용하여 이 오류를 생성하는 exe를 열 수 있습니다.종속성 워커는 필요하지만 컴퓨터에서 사용할 수 없는 DLL을 그래픽으로 신속하게 표시합니다.

Visual Studio(다른 CRT)의 ​​런타임 라이브러리를 놓칠 가능성이 높습니다. 해당 종속성을 제거하거나(정적으로 링크) 대상 컴퓨터에 VC redist 패키지를 설치할 수 있습니다.

사용하는 Visual C++ 버전에 따라 다른 패키지를 설치해야 합니다.

비주얼 C++ 2005

비주얼 C++ 2005 SP1

비주얼 C++ 2008

경고 :이러한 패키지에는 라이브러리의 릴리스 버전만 포함되어 있습니다. 애플리케이션의 디버그 빌드를 배포하려면 필요한 DLL을 직접 관리해야 합니다.

런타임에 정적으로 연결하는 것이 가장 간단합니다.

c++ -> 코드 생성 -> 런타임 라이브러리를 선택하고 "다중 스레드 /MT"를 선택합니다.

그러나 이렇게 하면 실행 파일이 수백 KByte 더 커집니다.많은 수의 작은 프로그램을 설치하는 경우 각 프로그램이 고유한 런타임 복사본으로 인해 부담을 받기 때문에 이는 문제가 될 수 있습니다.대답은 설치 프로그램을 만드는 것입니다.

새 프로젝트 -> "설정 및 배포" -> "프로젝트 설정"

애플리케이션 프로젝트(런타임의 DLL 버전을 사용하여 정의됨)의 출력을 설치 프로그램 프로젝트에 로드하고 빌드합니다.런타임 DLL에 대한 종속성은 설치 프로그램 패키지에 포함되어 대상 시스템의 올바른 위치에 깔끔하고 눈에 띄지 않게 설치됩니다.

귀하에게 적합한 VC Redist 패키지는 Visual Studio 설치의 일부입니다.VC 8의 경우 여기에서 찾을 수 있습니다.

\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\vcredist_x86

가능한 해결책........

편집하다:(대부분의 게시물을 제거했습니다) 긴 이야기 짧게, 비슷한 문제가 있었는데, "응용 프로그램 구성이 잘못된"메시지 등을 얻었습니다.dependency.exe는 가능한 문제로 ieshims.dll 및 wer.dll만 찾았지만 이는 문제가 아닙니다.나는 결국 멀티스레드(/mt) 컴파일 옵션을 사용하게 되었습니다.그러나 실행 가능한 솔루션으로 작동한 것은 InstallShield를 사용하여 설치 프로그램을 만드는 것입니다.installshield builder에서 여러 병합 모듈을 선택했는데 이로 인해 문제가 해결된 것 같습니다.선택된 모듈은 다음과 같습니다:VC++ 9.0 CRT, VC++ 9.0 DEBUG CRT 및 CRT WinSXS MSM 병합 모듈.저는 WinSXS 병합 모듈이 이 문제를 해결했다고 확신합니다.

디버그 CRT:나는 어딘가에서 (아무리 열심히 노력했지만 분명히 지금까지 실패했음에도 불구하고) 내 릴리스 버전이 여전히 DEBUG CRT에 의존한다는 것을 발견했습니다.여전히 그런 경우라면 InstallShield 병합 모듈이 이제 내 WinSXS 폴더에 DEBUG CRT 폴더를 배치했습니다. :) VC++에 대한 초보자인 저는 이것이 일반적으로 프로그램의 디버그 버전을 다른 사람들에게 배포하는 데 사용된다고 가정합니다.이것이 내 문제를 해결했는지 테스트하기 위해 WinSXS 폴더에서 DEBUG CRT 폴더를 제거했는데 응용 프로그램이 계속 작동했습니다.(무언가가 여전히 백그라운드에서 실행되고 있지 않는 한, 저는 별로 좋아하지 않습니다.)

어쨌든, 이것은 완전히 업데이트된 XP SP3 시스템과 기본이 포함된 VMWare XP SP3 시스템(기본적으로 .net 3.5 및 VC++ 2008 RTM) 및 이전에 친구의 XP 시스템에서 작동합니다. 작동하지 않았습니다.

그러니 이런 것들을 시도해 보면 행운이 있을지도 모릅니다.

가장 먼저 사용해야 할 것은

#define _BIND_TO_CURRENT_VCLIBS_VERSION 1

또는 추가 _BIND_TO_CURRENT_VCLIBS_VERSION=1 전처리기 지시어에.

문제는 바인딩 및 매니페스트 유형과 관련되어 있습니다. 자세한 내용을 찾을 수 있습니다. http://www.nuonsoft.com/blog/2008/10/29/binding-to-the-most-recent-visual-studio-libraries/

이렇게 하면 애플리케이션이 더 넓은 범위의 런타임 라이브러리 버전으로 실행됩니다.

이 오류는 .NET을 사용하는 응용 프로그램의 디버그 버전을 실행하려고 시도한 결과인 경우가 많습니다..NET 재배포 가능 패키지에는 Visual Studio와 함께 설치된 dll의 디버그 버전이 포함되어 있지 않으므로 Visual Studio가 설치되지 않은 다른 컴퓨터에서 애플리케이션을 실행할 때 이 오류가 발생하는 경우가 많습니다.아직 빌드하지 않았다면 애플리케이션의 릴리스 버전을 빌드해 보고 제대로 작동하는지 확인하세요.

또한 참고 - 정적 런타임으로 변경하는 경우 앱이 MFC를 사용하는 경우 MFC에 대해서도 동일한 작업을 수행해야 합니다.해당 설정은 속성->구성/일반에 있습니다.

이 문제가 발생하여 매우 간단하게 해결할 수 있었습니다.

Visual Studio에서는 각 빌드에 대한 매니페스트를 빌드하는 옵션(기본적으로 설정되어 있음)을 제공합니다.

매니페스트는 릴리스 폴더에 넣었지만 exe와는 다른 릴리스 폴더였습니다.

설정 유틸리티를 사용하는 경우에도 패키징되지 않았습니다.

myprogram.exe.indermediate.manifest와 같은 파일 이름을 찾아야 합니다.

이것이 exe와 동일한 폴더에 있고 모든 dll이 있는 경우 실행되어야 합니다.

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