visual c++ 2008로 개발된 프로그램을 visual c++ 2008 redistributable 를 설치하지 않고 사용하는 법?
글쓴이: kleinstein / 작성시간: 월, 2009/08/03 - 8:13오후
제목에서처럼..
윈도우에서 VS2008 의 C++ 로 개발된 툴을 visual c++ 2008 redistributable 패키지를 설치할수 없는!! 윈도우 XP 컴에 돌리고 싶습니다.
어떻게 방법이 없을까요?
Forums:
_
대부분의 경우 가장 쉽고 무거운 해결책은 static linking입니다. 프로젝트 속성에서 '런타임 라이브러리'에서 DLL로 사용하기가 되어 있는 걸 바꾸어주면 될 겁니다. 이러면 C/C++ 표준 라이브러리가 dll로 링크되지 않고 프로그램에 포함됩니다.
근본적인 문제는 VC++에서 dll 정책이 바뀌었기 때문인데 좀 많이 복잡합니다. http://www.gpgstudy.com/forum/viewtopic.php?t=18526&view=next&sid=4612805ba37a0467526907a5996f4457 등을 참고해주세요.
방법은 있습니다..
방법은 있습니다.. 그런데 조금 노가다스럽습니다. 천천히 알려드리겠습니다.
일단 알려드리기 전에 어째서 저런 문제가 나오는지에 대해서 간략하게 설명해드리겠습니다.
vs2005부터 side by side assembly 라는게 생겼습니다. 이런게 생긴 이유는..
다양한.. 그리고 많은 버전의 같은 이름의 dll이 버전관리 없이 컴퓨터에 깔리다보니
바이러스 또는 스파이웨어들이 dll인젝션을 수행하는 코드가 있는 dll을 마치 정상인냥
windows 디렉토리에 넣어놓게 되면 모든 프로그램은 그 dll을 로드하게 됩니다. 이러면
심각한 보안문제가 발생하게 되지요. 또한 버전관리 없이 여러 dll이 깔리다보니 구버전에는
없는 함수를 어떤 프로그램에서 사용할려고 하면 프로그램이 실행되지 않습니다. 같은 이유로
어떤 설치프로그램에서 구버전 dll을 덮어 써버리면 문제가 발생하지요.
이런 문제를 해결하기 위해서 vs2005부터는 실행 바이너리 내에 자신이 사용하는 dll의 이름, 종류,
버전등의 데이터를 함께 넣어놓고 그것만 로드하도록 바뀌었습니다. 운영체제는 xp부터 무조건 적용됩니다.
이 dll들은 windows디렉토리에 winsxs라는 디렉토리에 저장됩니다. manifest라는 dll버전과 이름, 종류등이
기록되어있는 텍스트 파일과 실제 바이너리들이 각각의 디렉토리에 저장되게 되어있습니다.
탐색기를 이용하여 windows\winsxs 디렉토리에 들어가보시면 수많은 파일이 있는것을 보실수 있습니다.
그런데 side by side assembly도 한가지 예외가 있는데, 실행파일 안에 manifest파일이 들어있으면 그것을
먼저 로드합니다. 이를 이용하여 실행파일을 배포할때 필요한 dll만 묶어서 배포 할수 있습니다.
1. 일단 배포하고자 하는 실행파일을 메모장으로 열어봅니다. 그리고 맨 마지막으로 가봅니다. 그러면
아래와 비슷한게 있을겁니다.
이것이 이 실행파일에서 로드하고자 하는 manifest입니다. 타입은 win32이고 이름은 Microsoft.VC90.CRT입니다. 그리고
버전은 9.0.21022.8이고 시피유 종류는 x86입니다. 그리고 키 토큰이 1fc8b3b9a1e18e3b입니다. 이걸 메모해두세요.
2. windows\winsxs 디렉토리로 가봅니다. 참고로 이 디렉토리 하위에는 엄청나게 많은 디렉토리가 존재하므로
로드하는데 시간이 좀 걸릴겁니다. 가셨으면 Manifests라는 디렉토리를 찾습니다. 그리고 Manifests디렉토리 내부에
들어가세요.
3. 이 안에도 엄청나게 많은 파일이 존재합니다. 보시면 파일 네이밍이 "시피유종류_이름_키토큰_버전_..." 이런식입니다.
1번에서 기억한 대로 이를 이용하여 확장자가 manifest인 파일을 찾습니다 cat이 아닙니다. 위의 경우에는 "x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_none_bcb86ed6ac711f91.manifest"가 될겁니다.
4. 찾으셨다면 그 파일을 배포하실 실행파일이 있는 디렉토리로 복사합니다. 그리고 파일이름을 1번에서 이름항목으로 바꿉니다. 여기서는 "Microsoft.VC90.CRT"이 되겠네요.
5. 바꾸셨다면 그 파일을 메모장으로 열어보세요. 그러면 아래와 같은 것이 보일겁니다.
이 manifest에서 제공하는 dll파일의 목록입니다. 여러개가 있을수 있습니다. 그러면 저 파일 이름을 메모해두시고
저 파일을 복사하러 가봅시다.
6. 동일하게 windows\winsxs로 갑니다.
dll은 이곳에서 찾으시면 됩니다. manifest파일을 찾았던 것처럼 이번에는 디렉토리가 동일한 형식으로 네이밍 되어있습니다.
동일한 방식으로 디렉토리를 찾아서 안에 들어가보세요. 그러면 dll파일이 보일겁니다. 이것들을 다 복사해 올 필요는 없고
실행파일을 PE Viewer등으로 열어봐서 import 테이블에 실제로 사용하는 dll만 복사해 오시면 됩니다. 모르시겠으면 그냥 다
복사해 오세요. 복사해 오신걸 배포하실 실행파일이 존재하는 곳에 넣습니다. 이렇게 해서 그냥 배포하시면 잘 됩니다.
이 과정은 배포하는 실행파일이 사용하는 또는 그 안에 있는 모든 dll 파일을 열어봐서 적용해주셔야만 합니다.
ps1. 인용한 manifest파일 내용중 "[" 으로 시작하는 것은 원래 "<" 입니다. 그냥 "<"으로 했더니 출력이 되지 않아서 바꿨습니다.
-- 추가 --
ps2. 다 귀찮으시면 그냥 visual studio에서 셋업 프로젝트를 만드신 다음에 셋업 프로젝트에서 패키징 해서 설치 파일로 만들어버리시면 위의 과정을 visual studio가 다 알아서 해줍니다. 한가지 단점이라면 단일 설치 파일로 만들어지기 때문에 사용자는 설치를 해야하는 귀찮은 과정이 따릅니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
댓글 달기