반응형

http://fendee.egloos.com/2230359



응용 프로그램 구성이 올바르지 않기 때문에 이 응용 프로그램을 시작하지 못했습니다VC++(2005)

원 제목: 응용 프로그램 구성이 올바르지 않기 때문에 이 응용 프로그램을 시작하지 못했습니다
"응용 프로그램 구성이 올바르지 않기 때문에 이 응용 프로그램을 시작하지 못했습니다"
실행파일을 실행했을때, 위와같은 에러가 발생했다면,


이런 오류가 발생했을때.
물론, 갖가지 상황들이 있을 수 있으므로, 만병 통치약은 아니겠지만,
내가 접한 이 오류에 대한 분석내용을 올린다.
Visual Studio C++ 2005 가 설치되어 있는 Windows XP pro 에서 만들어진 실행파일(콘솔응용)을
아무것도 설치되지 않은(.Net Framework, C++ Runtime) Windows XP pro 에서 실행했을때,
위와같은 에러를 만나게 되었다.
여러가지 상황에서 테스트를 해보았는데,
결론은 이러하다.
여러가지 상황테스트.
.Net Framework 만 설치하고 실행시켰을때, C++ Runtime 만 설치하고 실행시켰을때, 두가지 모두 설치하고 실행시켰을때,
그러나, 모두 에러가 발생했다.
그래서, 웹서핑도 해보고, 이것저것 해본결과.
우선, 내 경우는, debug 모드로 만들어진 실행파일이었다.
아래의 위치로 들어가보면,
C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT (Visual Studio 2005의 경우)
C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT (Visual Studio 2008의 경우)
내경우에는 Visual Studio 2005 이어서 이것을 기준으로 설명하겠다.
그 폴더에는 아래의 4개 파일이 있다.
Microsoft.VC80.CRT.manifest
msvcm80.dll
msvcp80.dll
msvcr80.dll
이 파일을 실행파일과 같은 폴더에 위치시키면 된다.
그런데, 문제는 그리 간단하지 않다.
위의 파일은 Release 모드로 만들어진 실행파일의 경우 필요한 파일이다.
만약, Debug 모드로 만들어진 실행파일이라면 아래의 파일이 있어야 한다.
C:\Program Files\Microsoft Visual Studio 8\VC\redist\Debug_NonRedist\x86\Microsoft.VC80.DebugCRT (Visual Studio 2005의 경우)
폴더안에 아래의 4개 파일이 있다.
Microsoft.VC80.DebugCRT.manifest
msvcm80d.dll
msvcp80d.dll
msvcr80d.dll
즉, 이 파일들이 없어서 에러가 났다는 것이다.
다시한번 주의하자, Debug 모드로 실행파일을 만든경우와, Release 모드로 실행파일을 만든경우 실행파일과 같이 넣어줘야할 파일이 틀리다.
보면, 디버그모드(Debug) 의 파일들에는 Debug 가 붙거나, 파일이름에 d 가 붙어 있다.
자신이 만든 실행파일이 어떤 모드에서 만들었는지 잘 기억했다가 필요한 파일로 첨부시키면 된다.
그런데, 한가지 재미있는 점은,
만약, Release 모드로 실행파일을 만들었다면, C++ Runtime 가 컴퓨터에 깔려있으면, 위의 파일들을 첨부하지 않아도 된다는 것이다.
Debug 모드로 만든경우에는 C++ Runtime 가 설치되어 있어도 에러가 난다.
그러나, 내가 만든 실행파일은, 정말 기초적인 코딩들만 들어있었다.
그런데도, C++ Runtime 를 필요로 했다면, 이건 정말 기막힐 노릇이다.
항상 프로그램을 누군가에게 주기전에 C++ Runtime 를 먼저 설치하라고 해야 한다는 말인데,
누가 그걸 설치하겠는가.
결국, 그냥 Release 모드로 만든후, dll 파일과 manifest 파일(총4개)을 실행파일과 함께 주는법 밖에는 없다는 결론이다.
정말 지극히도 단순한 코딩인데도 말이다.(Debug 모드로 만든경우에는 48kbyte 이고, Release 모드로 만든경우에는 5kbyte 밖에 안되는데도 말이다)
더 황당한것은, .Net Framework 2.0 을 설치했는데도 에러가 났다는 것이다.

그리고, 위에서 말한 폴더들을 왔다갔다 하다보면,
그 폴더만 있는게 아니고,
Debug 관련 폴더의 경우,
Microsoft.VC80.DebugMFC 폴더, Micorosft.VC80.DebugOpenMP 폴더가 있고,
Release 관련 폴더의 경우,
Microsoft.VC80.ATL 폴더, Microsoft.VC80.MFC 폴더, Microsoft.VC80.MFCLOC 폴더, Microsoft.VC80.OPENMP 폴더가 있는데,
만약, 코딩에서 MFC 를 사용했다거나, 기타 다른 것들을 사용했다면, 각 폴더안의 파일들도 같이 넣어줘야한다.
테스트결과, MFC 를 이용한 실행파일은 CRT 와 MFC 관련 폴더안에 있던 파일들을 모두 넣어줘야 에러가 나지 않았다.
하여간, 뭐가 이리 복잡한겐가.
TurboC++ 3.1(win) 에서 만든 실행파일은 기냥 돌아가더구만.
Visual Basic 의 경우에도, dll 파일을 같이 동봉해야 하는 경우가 많아 이런 에러를 만날일이 많을것이다.
듣기로는 델파이의 경우, 아예 실행파일에 dll 내용을 첨부한다던데,
물론, 그렇게 하면 실행파일의 덩치가 커지는 문제점도 있지만, 이와같이 배포시 문제점은 완벽히 해결되지 않을까?



<Visual Studio> 응용프로그램 구성이 올바르지 않기 때문에 이 응용 프로그램을 시작하지 못했습니다. 해결방법 낙서장

2010/08/27 19:14

복사http://blog.naver.com/myrandy1/80114297241

VS2005 이후로는 제작한 프로그램을 VS가 설치되지 않은 PC에서 실행할 경우

구성이 잘못되어 응용프로그램이 실행되지 않는다는 에러가 뜨면서 실행되지 않는다.

이유는 런타임 라이브러리를 exe파일에 내재하지 않고 dll파일을 이용하여 참조하기 때문에

dll파일이 없거나 그 버젼이 다를 경우 에러가 발생된다.

몇 시간의 삽질 끝에 드디어 위의 문제를 해결할 수 있는 방법을 알아냈다.

1. 일반적으로 인터넷에 나온 방법은 다음과 같다.

C:\Program Files\Microsoft Visual Studio 9.0\VC\redist

C:\Program Files\Microsoft Visual Studio 8\VC\redist

를 보면, 재배포 정보들이 있는데

릴리즈 모드로 빌드된 프로그램은 x86, 디버그 모드로 빌드된 프로그램은 Debug_NonRedist폴더 에 들어있다.

예로 든 실행exe파일은 디버그 모드로 빌드된 프로그램이므로

C:\Program Files\Microsoft Visual Studio 8\VC\redist\Debug_NonRedist\x86\Microsoft.VC80.DebugCRT

C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC90.DebugCRT

에 있는 파일들을 실행exe파일과 같이 배포하면 된다.

배포해야 하는 파일에는 다음과 같은 것들이 있다.

Microsoft.VC90(VC80).DebugCRT.manifest

msvcm90(80)d.dll

msvcp90(80)d.dll

msvcr90(80)d.dll

2. 하지만 실행이 되지 않았다. 보통 인터넷에 나와있는 설명에는 버전에 대한 설명이 없어서 정말 많이 해멨다...

실행파일이 요구하는 dll파일의 버젼을 알아내는 방법은 다음과 같다.

Visual Studio의 File -> Open -> File -> 실행 exe파일로 열면 메니페스트 디펜던시 정보를 얻을 수 있는데..

메니페스트 정보를 더블 클릭하면 디펜던시 정보가 hex파일로 나온다.

이를 마우스로 긁어서 메모판에 붙여 넣기를 하면 메니페스트 정보를 확인할 수 있다.

癤??xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" version="8.0.50727.762" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
</assembly>

해당 실행파일이 필요로 하는 정보는 Microsoft.VC90.DebugCRT (9.0.21022.8), Microsoft.VC80.DebugCRT (8.0.50727.762)임을 알았다.

하지만, C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC90.DebugCRT

에 있는 dll 파일들의 버젼을 확인해보니까 9.0.30729.1였다. 알고보니 dll파일의 버젼이 하나라도 다르면 실행이 안되는 것이었다.

우리가 필요한 dll버젼은 9.0.21022.8 이기 때문이 이를 찾아야 한다.

이는 C:\Windows\winsxs 에서 찾을 수 있다.

엄청나게 많은 폴더들이 있는데, 잘 찾아보면

x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_96748342450f6aa2 란 이름의 폴더가 있는 것을 볼 수 있다.

이를 열어보면 우리가 찾는 9.0.21022.8 버젼의 dll파일들이 있음을 알 수 있다.

dll의 버젼이 9.0.21022.8이므로 Microsoft.VC90.DebugCRT.manifest 파일도 수정돼야 한다.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<noInheritable></noInheritable>
<assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" version="9.0.30729.1" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
....

버젼이 9.0.30729.1로 되어 있으므로 이를 9.0.21022.8로 고친다.

이렇게 해서 고친 매니페스트 파일과 런타임 dll을 실행exe파일과 함께 배포하면....

VS가 설치되지 않은 PC 에서도 잘 동작함을 볼 수 있다.

요약하면, 실행exe파일과 함께 배포해야 하는 파일은

Microsoft.VC90(VC80).DebugCRT.manifest

msvcm90(80)d.dll

msvcp90(80)d.dll

msvcr90(80)d.dll

인데, dll의 버젼과 manifest파일에 명시된 버젼과 실행 exe파일이 요구하는 dll의 버전이 모두 일치해야 한다는 것이다.


http://blog.naver.com/drvoss/20048402862

Dependency Walker : http://www.dependencywalker.com/

오늘 세미나에서 VS2008, 혹은 VS2008 feature pack에 있는 DLL들을 같이 배포 해야 하는가 라는 질문을 받았습니다. 아마도 클라이언트 PC에 2005로 컴파일된 바이너리와 2005 재배포패키지에 있는 DLL파일이 이미 배포되어 있는 상태이셨던것 같습니다.

어플리케이션은 빌드 당시에 물었었던 DLL로 링크가 됩니다. 메니페스트 파일에 이러한 내용들이 링크타임에 기술이 되게 되며,운영체제에서는 이것들을 DLL 버전등에 기반한 side by side로 관리를 합니다.

Windows 폴더에 가보시면 WinSxS 라는 폴더가 존재 하는데, 이 폴더에 보시면 같은 파일들이 각 버전별로 서로 분리가 되어 있습니다. 처음 보시는 분들은 시스템에 따라 엄청나게 많은 폴더에 있는 같은 파일에 당황스러우실 껍니다.

Side by side를 고려 하지 않으면, 보통 exe파일과 같은 폴더에 있는 DLL을 사용할 것이라 잘못 생각할 수 있습니다.

Dependency Walker exe 파일을 열면 아래와 같이 exe 파일이 물고 있는 DLL들의 목록이 보여 집니다.

여기서 F9를 눌러 보면 각 DLL 들의 Full Path가 나오게 됩니다.

아래 그림에서 보시는 것처럼 ALZip.exe은 커먼컨트롤 DLL winsxs 폴더에 저 경로의 것을 사용합니다. ALZip.exe가 있는 폴더에 다른 버전의 같은 DLL 파일을 복사해도 ALZip.exe winsxs에 있는 DLL 파일을 이용할 껍니다.

제 컴퓨터에는 아래의 두개의 경로에 같은 커먼컨트롤DLL 파일이 존재 합니다.

C:\Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.6000.16386_none_87e0cb09378714f1

C:\Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.6000.16386_none_5d07289e07e1d100

디펜즈에서 보시는 것 처럼 첫번째 것을 사용하고 있는데, 두번째 것을 ALZip.exe와 같은 경로로 복사를 해도 여전히 winsxs 폴더에 것을 사용하고 있음을 확인하실 수 있습니다.

exe파일의 경우 자신이 링킹될 때 참고된 DLL에 대한 메니페스트를 가지고 있고, 나중에나중에 될 때 가장 우선으로 자신이 링킹될 때 참고한 DLLside by side에서 선택합니다. 맞지 않는 DLL을 참고할경우 윈도 제어판 이벤트로그에 워닝이 남습니다.

이번 VS2008에서 side by side정보가 변경되었습니다. 따라서, dll 파일을 같이 배포해 주셔야 맞습니다.

재배포 패키지를 찾아서 배포해 주셔도 되고, 디펜즈에 있는 DLL 파일들을 복사해서 같이 복사해 주셔도 됩니다. 편한 방법을 선택하시면 됩니다.


Dependency Walker 사용법

http://notgivuphil.tistory.com/413

[쥔장]--------------------------------
전에는 idasm (visual studio.net) 을 통해서 dll을 확인했었는데, dependency walker 라는 프로그램이 있다는 사실을 알고서 이에 대한 사용방법이 있기에 스크랩을 해본다.

하지만 봐도 잘 모르겠다는... ^^;
--------------------------------------

0 - Dependency Walker?

쉽게 이야기해서 프로그래밍이 사용한 DLL 정보와 DLL에 들어있는 함수 중 사용한 함수를 보여주는 툴 (~)

1- 프로그램위치 (VS 2005기준) – 편하게 아래쪽 그림 참고

2- 그럼 실행해보자 ^0^

(1) 연결된 DLL정보를 볼 프로그래밍을 선택하기 위해 아래 아이콘을 클릭한다.

(2) 연결된 DLL 정보를 볼 프로그래밍을 선택한다

< 참고로 난 안사람은 안다는 저 흐뭇한 게임의 속을 보려고 한다 *_ *(개인적취향에 존중을)>

! 프로그래밍을 선택하고 열기를 누르자!

(3) 나온 화면

잠시 아래 Warning은 무시하자.. 그냥 대충 보니 뭔가 미확인 DLL때문에 빠진 함수가 있다는 말인 것 같다.. 참고로 난 영어 못한다. 그래서 틀린 해석일 수도 있다는 점 밝힌다. ㅡㅡㅋ;

(4) 자 사용된 DLL과 그 DLL에서 사용된 함수를 봐보자!

딱 보니 이 흐뭇한 게임에 사용된 DX9 버전은 9_32 버전이라는 점과 함께 D3DXCreateEffect 사용된것 봐서 쉐이더 HLSL를 사용했다는 것이 보이군요 후후후

(5) 자 그럼 내 프로그래밍에서 사용된 DLL는 어디에?

파란색 네모에 있는 아이콘을 누르면 바로 DLL 있는 FullPaths 가 표시 된다.

(6) 기타

* 이외에도 여러 기능들이 있는 것 같으니 직접 한번 해보시길

* Dependency Walker에 아쉬운점은 바로 아까 무시한 워닝을 출력하게 한 것처럼

MS나 공식적인 DLL가 아닌 사용자가 만든 DLL (ex, 게임엔진의 DLL)는 표씨 하지 않는다는 점이다. (어떻게 생각해보면 당연한 것 일수도 있다.) -> 응? 아닌데 나오던데?

(7) 끝으로 프로그램을 배포할 때 무슨 DLL이 사용되었고 어떤 DLL를 포함해야 할지 이 프로그램으로 먼저 파악하고

아래 같은 상황이 생겨 당황해 하지 않기 바란다..

반응형

+ Recent posts