1 VS 2005로 만든 프로그램을 실행할 때 필요한 파일 #참고;
http://www.gungume.com/75
DLL Hell이란 http://www.larosel.com/39 http://somma.egloos.com/3020481 http://hongyver.pe.kr/ttblog/tag/dll%20hell
새로운 프로그램을 설치할때 다른 프로그램이 사용하는 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
cf.windows안에 winsxs폴더를 찾고, 없으면 crt명과 같은 폴더명이 있으면 그안에 manifest파일을 찾고, 거기도 없으면 실행파일과 같은 폴더에서 manifest를 찾는다(in 한글판 msdn)에서 CRT, MFC, ATL에 맞는 dll을 실행파일과 같은 경로명에 복사해 준다.(Microsoft.VC80.*.manifest 도 포함해서) 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 안에 있는
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
2. Visual C++ Redistributable Package (VCRedist_x86.exe, VCRedist_x64.exe, VCRedist_ia64.exe) 를 이용해서 1번 처럼 WinSxS 에 Assembly 를 등록한다(이 패키지들은 ms 사이트에서 다운로드 할 수 있다). How to: Deploy using a Setup and Deployment Project - http://msdn2.microsoft.com/en-us/library/ms235317(VS.80).aspx
3. Private Assembly를 사용한다. 문제는 공유되는 assembly가 아니므로 혼자만 사용할 수 있다는 것이고, assembly 들에 대한 menifest 를 함께 배포해야 한다.
vs8 을 디폴트로 설치한 경우
C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT
manifest 를 생성해서 임베딩하지 않은 경우 (vs 2005 이전 버전) 또는 exe 에 대한 manifest 가 함께 존재하지 않는 경우 loadLibrary() 를 통해서 msvcr80.dll 을 로딩하려 하면 오류가 발생한다.아래에 DLL 들이랑 manifest 가 있는데 이녀석들을 함께 배포해 주면 된다. (crt 라이브러리만 사용한 경우 msvcr80.dll 과 Microsoft.VC80.CRT.manifest 만 배포하면 된다)
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을 받아서 설치하면 링크 에러가 해결되네요. ^^;; |
손에 망치밖에 든 것이 없다면, 세상 전부가 못처럼 보일 것이다. BlogChanges 바람_참고사이트 바람06_2012 Artist |