얼마전 VS 2008로 만든 릴리즈 버전 프로그램을 배포 하려 했는데 문제가 있었다.

 되는 컴퓨터가 있고, 안되는 컴퓨터가 있는 것이다.

 그래서 그냥 필요하다는 dll을 모두 릴리즈 폴더안에 넣어 두었다.

 하지만 그렇게 하더라도, 시작점을 제대로 초기화 하지 못했다면서 죽어 버리는 문제가 발생하였다. 

 이것의 원인이 무엇인가 하고 계속 검색을 해보니.. 2003 이후부터 (2005인지 2008인지 모르지만 일단 넘어감) dll을 링크할 시에

widows폴더에 winSxS 라는 폴더에 각 버전에 맞는 dll을 링크 하도록 바뀌었다고 한다 ..

 즉 예전에는, 그냥 컴파일 했던 컴퓨터의 dll을 폴더에 넣어만 줘도 해결 되던 문제들이 이제는 안되는 것이다.

 그래서 생각한 첫번째 해결책은 재배포 패키지를 설치하는 것이다. (각 버전에 맞는 패키지 들은 마이크로소프트 다운로드 센터에서 받을 수 있다.)

 하지만.. 그렇게 설치를 했지만 문제가 생겼다.. 여전히 같은 증상인 것이다. 참고로 나는 2008로 컴파일을 했기 때문에 2008 기본 재배포와 sp1 재배포를 설치했었다.

 그래서 또 알아보니, 여기에 링크되고 있던 라이브러리 중 하나가 예전 버전 dll을 이용하고 있었던 것이다.

 그래서 이전 버전 재배포 까지 깔고 나서야... 겨우 문제가 해결되었다.

 하지만, 또 한가지 문제가 있었으니... xp용 컴퓨터에서는 잘 동작하는데.. 윈도우 7에서는 먹통이 되는 것이였다.. 분명히 재배포도 깔고 다 깔았는데 why? 라고 생각했지만, 이것도 사실 간단한 문제였었다.

 윈도우 7은 다이렉트 11을 기본적으로 설치해 놓고 있는데.. 프로그램을 개발할 때 썻던 버전은 다이렉트9 였던 것이다. 그래서 다이렉트 9 버전의 런타임 라이브러리를 설치했더니 7에서도 문제 없이 돌아갔다.

 사실 알고 보면 참 원인은 간단한데.. 모를 땐 답답하니... 이렇게 정리를..

 ps. 한가지 해결책이 더 있는데 그것은 매니페스트 파일(2008인지 2005부터 생김)을 직접 손을 봐서 해결 하는 방법이다. 

 - 윗 부분 생략 -

<dependency>

    <dependentAssembly>

<assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.1" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

    </dependentAssembly>

  </dependency>

</assembly>

 

위의 설정을 보면 Microsoft.VC90.CRT 관련하여 9.0.30729.1 버전의 32bit dll을 링크한다는 의미이다.  현재

publicKeyToken
에 대해서 없어야 된다는 의견도 있으나, 저것이 있어도 실행되는 컴퓨터에서는 전혀 이상없이 동

작하기 때문에 조금 더 옵션에 대해 알아봐야 할 것 같다.


ps. 아 또 한가지 해결책이 있는데 컴파일 옵션을 dll을 애초에 컴파일 하면서 포함하도록 하면, 용량은 좀 늘어나지만, 배포하

기는 훨씬 수월해진다. 하지만, 이 것은 미리 컴파일 된 해더와 서로 충돌이 있어, 이 문제를 해결 하고 사용해야 할 것이다.



Posted by 바람처럼..
|