MoniWiki메모장_VS2005로_만든_프로그램_배포방법
Login:
Password:
대문|찾기|바뀐글|목록|메모장|책갈피|연꽃|링크
Edit Diff Reload Search Print Info Mail Help RSS

@ 2008-04-09 @
  VS 2005로 만든 프로그램 배포 방법
1 VS 2005로 만든 프로그램을 실행할 때 필요한 파일
1.1 개별파일
1.2 VS.NET용 라이브러리
2 *.dll과 WinSxS
2.1 msvcr80.dll/ msvcp80.dll
2.2 dll 적용 예
2.3 WinSxS
3 VS 2005 컴파일하다보면 생기는 링크 에러: warning PRJ0018
{_r} 메모장으로 가기


1 VS 2005로 만든 프로그램을 실행할 때 필요한 파일 #

참고;
DLL Hell이란
새로운 프로그램을 설치할때 다른 프로그램이 사용하는 DLL을 덮어 쓰거나 혹은 버전의 불일치로 오는 문제로 기존의 프로그램들이 제대로 동작하지 않는 경우로,
Windows XP에서는
DLL Hell을 피하기 위해 Side-by-Side Assembly라는 개념을 만들었는데, 여러 버전의 DLL을 동시에 시스템에 존재할 수 있게 해주고, DLL을 사용하는 응용프로그램이 원하는 DLL 버전을 골라서 쓸 수 있도록 해주는 방법이다.
SideBySideAssembly 의 강력한 점은
응용프로그램에서 직,간접적으로 로드하는 모든 DLL이 이 설정의 영향을 받는다는 것이다. 이전에는 응용프로그램이 로드한 DLL에 의해서 간접적으로 로드되는 DLL을 제어할 수 있는 방법이 없었다.
이러한 새로운 방식으로
기존방식대로 VS.NET 라이브러리를 복사하는것으로 끝나지 않고 배포를 위한 별도의 작업이 필요하게 된다(VS 2005의 crt dll을 그냥 배포하면 남의 컴퓨터에서 실행이 안된다)

1.1 개별파일 #


        Microsoft.VC80.CRT.zip     Microsoft.VC80.MFC.zip     vcredist_x86.exe    

1-1.콘솔프로그램은 "Microsoft.VC80.CRT.zip" 파일을 받아서 압축파일내 파일을 실행파일과 같이 사용
1-2.MFC 프로그램인 경우는 "Microsoft.VC80.MFC.zip" 파일을 추가로 받아서 파일을 사용
1-3.다른 프로그램 사용시 편리성을 위해 가능하면 vcredist_x86.exe 파일을 (Microsoft Visual C++ 2005 재배포 가능 패키지(x86))받아서 설치

1.2 VS.NET용 라이브러리 #

1.릴리즈 버전은
C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86
2.디버그 버전은
C:\Program Files\Microsoft Visual Studio 8\VC\redist\Debug_NonRedist
에서 CRT, MFC, ATL에 맞는 dll을 실행파일과 같은 경로명에 복사해 준다.(Microsoft.VC80.*.manifest 도 포함해서)
cf.windows안에 winsxs폴더를 찾고, 없으면 crt명과 같은 폴더명이 있으면 그안에 manifest파일을 찾고, 거기도 없으면 실행파일과 같은 폴더에서 manifest를 찾는다(in 한글판 msdn)

2 *.dll과 WinSxS #

2.1 msvcr80.dll/ msvcp80.dll #

-.msvcr71.dll/ msvcp71.dll ; Microsoft Visual Studio 2003을 통해 개발한 어플리케이션에서 필요로 하는 dll 파일
-.msvcr80.dll/ msvcp80.dll ; Microsoft Visual Studio 2005을 통해 개발한 어플리케이션에서 필요로 하는 dll 파일
-.msvcr71.dll/ msvcp71.dll 파일은 닷넷 프레임워크와는 전혀 상관이 없는 파일이며,
msvcr은 Microsoft® C Runtime Library이며, msvcp는 Microsoft® C++ Runtime Library 이다. 즉, C/C++ 표준 라이브러리의 함수들을 사용하며, mxmlc.exe에 C/C++ 라이브러리 함수들 코드가 포함되지 않도록 빌드되었기 때문에 실행시 이 코드들을 담고 있는 dll 파일이 필요하다.
이는 닷넷 프레임워크와는 전혀 상관이 없는 C/C++로 개발된 프로그램의 실행시 관련된 사항으로 mxmlc.exe가 VC++로 개발되었다는 이야기이며, VC++로 개발된 모든 프로그램에 공통적으로 해당된다.

2.2 dll 적용 예 #

MFC를 안쓰고 release버전만 배포한다면
C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT 안에 있는
Microsoft.VC80.CRT.manifest
msvcp80.dll
msvcr80.dll 만 실행파일과 같은 폴더에 넣어주면 된다.
msvcm80.dll은 매니지드C++용 crt라 native를 쓰는 경우는 배포하지 않아도 된다.

2.3 WinSxS #

WinSxS이란 Native Assembly Cache로, 기능은 .NET 의 GAC(Global Assembly Cache)와 유사하며,
결국 GAC 처럼 manifest 를 통해서 WinSxS 에서 지정한 assembly, 즉 dll 을 지정한다.

문제는 VS 2005 로 만든 어플리케이션이 msvcr80.dll (릴리즈 버전 인경우) 을 사용하도록 설정되어있다면 배포시에 예전 처럼 msvcr80.dll 을 exe 와 같은 폴더 혹은 path 가 잡인 경로에 복사하는걸로 끝나지 않는고, 필요한 dll 을 exe 와 같은 디렉토리 또는 path 에 배포해도 아래와 같은 오류가 발생한다.
(다음 그림은 http://somma.egloos.com/3020481에서 인용)

[vs8 링커옵션에서 manifest 생성하도록 설정한 경우]

[vs8 링커옵션에서 manifest 를 생성하지 않도록 설정한 경우] 다음의 3가지 방법으로 해결
1.Vistual C++ Redistributable Merge Module 을 이용해서 Shared Side-By-Side assemblies 를 Native Assembly Cache, 즉 WinSxS 폴더에 설치한다. 이게 가장 권장하는 방식이라고 하지만.. WinSxS 폴더에 Assembly 들을 등록하려면 Admin 권한이 필요하다.
Redistributing Using Merge Modules - http://msdn2.microsoft.com/en-us/library/ms235290(VS.80).aspx
How to: Deploy using a Setup and Deployment Project - http://msdn2.microsoft.com/en-us/library/ms235317(VS.80).aspx

2. Visual C++ Redistributable Package (VCRedist_x86.exe, VCRedist_x64.exe, VCRedist_ia64.exe) 를 이용해서 1번 처럼 WinSxS 에 Assembly 를 등록한다(이 패키지들은 ms 사이트에서 다운로드 할 수 있다).

3. Private Assembly를 사용한다. 문제는 공유되는 assembly가 아니므로 혼자만 사용할 수 있다는 것이고, assembly 들에 대한 menifest 를 함께 배포해야 한다.

vs8 을 디폴트로 설치한 경우
C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT
아래에 DLL 들이랑 manifest 가 있는데 이녀석들을 함께 배포해 주면 된다.
(crt 라이브러리만 사용한 경우 msvcr80.dll 과 Microsoft.VC80.CRT.manifest 만 배포하면 된다)

manifest 를 생성해서 임베딩하지 않은 경우 (vs 2005 이전 버전) 또는 exe 에 대한 manifest 가 함께 존재하지 않는 경우 loadLibrary() 를 통해서 msvcr80.dll 을 로딩하려 하면 오류가 발생한다.

manifest 파일을 배포할 때 빌드환경에 따라서 문제가 발생할 수 있다.
예를 들어 exe 파일을 service pack 1 이 적용된 Visual Studio 2005 로 만들고, service pack1 이 적용되지 않았을 당시의 manifest 를 배포했다면 오류가 발생한다. 즉 바이너리의 빌드환경과 동일한 버전의 manifest 를 배포해야 한다.

3 VS 2005 컴파일하다보면 생기는 링크 에러: warning PRJ0018 #

VS2005 컴파일하다보면 생기는 링크 에러입니다....
링크 에러 메시지는..
1>Linking...

1>Xxxx.lib(xxx.obj) : error LNK2001: unresolved external symbol __GSHandlerCheck
1>xxx.obj : error LNK2001: unresolved external symbol _Input
1>xxx.obj : error LNK2001: unresolved external symbol _Input
1>STANDARDSDK_500 (ARMV4I)\Debug/TestApp_WM.exe : fatal error LNK1120: 3 unresolved externals
1>Project : warning PRJ0018 : The following environment variables were not found:
1>$(PLATFORMDEFINES)

답>
http://www.microsoft.com/downloads/thankyou.aspx?familyId=bb4a75ab-e2d4-4c96-b39d-37baf6b5b1dc&displayLang=ko
에서 vs2005 서비스팩 1을 받아서 설치하면 링크 에러가 해결되네요. ^^;;


{_r} 메모장으로 가기

October, 2026
 123
45678910
11121314151617
18192021222324
25262728293031

손에 망치밖에 든 것이 없다면, 세상 전부가 못처럼 보일 것이다.

BlogChanges
바람_참고사이트
바람06_2012
Artist
last modified 2008-08-17 06:06:53
고치기|찾기|쪽 지우기|비슷한 쪽 Valid XHTML 1.0! Valid CSS! powerd by MoniWiki
0.0268 sec