비주얼 스튜디오를 사용해서 프로그램을 개발해서 배포를 한뒤에 자주 접하게 되는 문제는 '재배포' 관련 문제들이 많다. 사용자 컴퓨터에 프로그램 실행을 위해 필요한 재배포 패키지가 설치되어 있지 않을때 여러가지 유형으로 에러가 발생한다. 재배포 패키지 설치 유무에 따라서 대략 4가지 정도로 나뉘는것 같고 아래와 같다.

1. 프로그램 정상 동작. (필요한 재배포 패키지가 모두 잘 설치된 경우.)
2. 프로그램 정상 동작. (재배포 패키지가 없는데도 잘되는 경우. !!!? 좋아하지 말자. 그냥 운이 좋을뿐!?)
3. sxs ?????? 오류. (재배포 패키지가 설치되지 않음.)
4. 0x000000 ?????? 오류. (재배포 패키지가 설치되지 않음. 혹은 꼬임. 주로 프로그램과 포함되는 라이브러리간의 재배포 패키지에 사용된 버전이 다른경우.)

(혹시 다른 경우가 있다면 알려주시면 좋겠습니다^^)

위와 같은 형태로 대부분 나타난다. 이전에 스마트한 재배포 메모 글에서 비주얼 스튜디오에 적용된 vcredist 의 최신 버전으로 설정하는 방법을 적어 놓았는데. 다시 살펴보면

_BIND_TO_CURRENT_VCLIBS_VERSION 에 0 or 1 값을 적용해서 자신의 비주얼 스튜디오에 적용된 vcredist 의 버전을 결정할 수 있다. (프로그램 컴파일시 전처리기 설정 부분에 넣어주면 됨.)

_BIND_TO_CURRENT_VCLIBS_VERSION=0      <-    최초(?) 기본 버전을 포함하도록 한다.
_BIND_TO_CURRENT_VCLIBS_VERSION=1      <-    최신 버전을 포함하도록 한다.

자 그럼 자신의 개발 환경에서 vcredist 버전이 어떻게 되는지 확인해 보려면 어떻게 하면 될까? 가장 무식한 방법은 위의 전처리기 설정을 하고 비주얼 스튜디오에서 제공하는 유틸리티 mt.exe 를 이용해서 생성된 프로그램(프로그램에 manifest 가 포함된 경우)에서 추출해 볼 수 있다.

mt.exe -inputresource:test.exe -out:test.result.txt

위와 같이 실행하면(mt.exe 를 실행하기 위해서는 visual studio 명령 프롬프트에서 실행가능하다) out.result.txt 파일에 manifest 정보가 저장된다. 자신을 괴롭히고 싶다면 _BIND_TO_CURRENT_VCLIBS_VERSION 설정을 바꿨을때 마다 해보길 바란다..(=ㅂ=ㅋ)

더 간단한 방법으로는 비주얼 스튜디오가 설치된 폴더에서 crt 관련 헤더가 있는 파일을 열어보면 된다. 아마 각 버전마다 설치된 경로에 따라 다르겠지만 대략 아래와 같을테니 경로는 참고해 주세요.

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\crt\src\crtassem.h

위의 파일을 열어보면 _CRT_ASSEMBLY_VERSION 매크로가 정의되어 있는 부분을 찾을 수 있는데 거기에 적힌 버전이 현재 자신의 비주얼 스튜디오에서 적용가능한 vcredist 버전을 알 수 있겠다. 대략 아래와 같은 모습...


#ifndef _CRT_ASSEMBLY_VERSION
#if _BIND_TO_CURRENT_CRT_VERSION
#define _CRT_ASSEMBLY_VERSION "9.0.30729.6161"
#else  /* _BIND_TO_CURRENT_CRT_VERSION */
#define _CRT_ASSEMBLY_VERSION "9.0.21022.8"
#endif  /* _BIND_TO_CURRENT_CRT_VERSION */
#endif  /* _CRT_ASSEMBLY_VERSION */


일단 협업을 하면서 다른 개발자의 컴퓨터에서 재배포 관련 문제가 발생할 경우 crtassem 의 최신/기본 버전이 같은지 확인해 보는것이 좋다. 그리고 기본 버전이 같다면 개발중일때는 기본 버전을 사용해서 개발하는것도 나쁘지 않다. (물론 사용되는 라이브러리들도 모두 재컴파일 해야하지만...). 마지막으로 빌드 컴퓨터가 따로 마련되어 있다면 그 컴퓨터에서는 최신 vcredist 를 사용하게 하고. (포함되는 라이브러리도 같이 컴파일 해줘야 겠지?) 그에 맞는 재배포 패키지도 함께 설치되도록 설치 프로그램을 만들면 되지 않을까?

(음 개발버전과 출시버전의 vcredist 가 다른경우에 발생할 문제가 있을 수 있을지도 모르겠다. 그러면 아예 이전 vcredist 의 버그나 문제점을 감수하고 그냥 옜날 버전을 쓰는것도... 한 방법이 될 수 있겠다;;;)

아무튼 대략적인 재배포 문제 관련된걸 정리해 놓음! (다음은! 설치 프로그램에서 어떤 재배포 패키지가 설치되어 있는지 알아보는 방법을 정리해 보쟈~)


Posted by ngcbbs
,