'빵꾸똥꾸 개발자/Windows'에 해당되는 글 2건

  1. 2010.03.24 win32 vc2005/2008 배포시 문제 해결
  2. 2010.03.17 [win32] libiconv 포팅하기
출처: http://jihune.com/tc/zemyblue/tag/298


visual studio 2005부터 MFC나 CRT등의 dll 라이브러리를 사용할 때 각각의 버젼을 달리 사용할 수 있도록 winSxS(side-by-side) 기능을 도입해서 배포할 때 주의를 기울이지 않으면 "Win32 error On14001"의 "응용 프로그램 구성이 올바르지 않기 때문에 이 응용 프로그램을 시작하지 못했습니다"라는 에러를 볼 수 있습니다.

이 는 dll이나 exe 파일을 컴파일 할 때 링크로 참조하는 dll 파일들을 버젼과 경로등을 manifest라는 파일로 관리하고 이를 dll, exe 파일에 포함시켜서 찾으려고 하는데 찾지 못하기 때문에 나오는 에러입니다.

제가 이 에러를 본것은 콘솔창에서 실행되는 프로그램을 개발했기 때문에 VC80.CRT라는 디렉토리에 있는 라이브러리를 찾는데. 이를 visual studio 2008이 설치되지 않은 다름 컴에서는 찾지 못하기 때문에 발생을 했었습니다.
컴파일을 할 때 object들이 생성되는 디렉토리에 보면은 <프로그램명>.<확장자(exe또는 dll)>.intermediate(또는 embed).manifest 파일을 보실 수 있습니다. 이를 열어보면 다음과 같습니다.

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>


(위 파일을 Release로 컴파일을 한후에 생성된 manifest 파일입니다.)
여기서 중요한 것은 굵은 글씨체로 표시한 부분인데 이 부분이 참조할 dll 파일들의 경로와 버젼등의 정보를 표시한 것입니다. 이것을 찾아야 하는데 이게 없기 때문에 프로그램이 실행되지 않고 에러가 나오는 것입니다.

여기서 Microsoft.VC90.CRT라는 디렉토리를 찾게 되는데 찾는 디렉토리의 순서가 다음과 같기 때문에 다음의 어떠한 경우라도 속하면 프로그램은 이상없이 실행될 수 있습니다.

  1. WinSxS하위의 Side-by-side가 속한 디렉토리, 그러니까. 위와 같은 경우에는 "C:/Windows/WinSxS/x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_none_bcb86ed6ac711f91" 를 찾습니다.
  2. 어플이 있는 디렉토리에서 해당 DLL 파일, 위와 같은 경우에는 Microsoft.VC90.CRT로 구성된 msvcm90.dll, msvcp90.dll, msvcr90.dll 이 어플과 같이 있으면 됩니다.
  3. 어플이 있는 디렉토리에서 <assemblyname>.manifest 파일
  4. 어플이 있는 디렉토리에서 <assemblyname>디렉토리 하위에 해당 DLL 파일
  5. 어플이 있는 디렉토리에서 <assemblyname>/<assemblyname>.manifest 파일
그 러므로 위와 같이 해당 파일이 dll 파일이 적절히 있다면 문제없이 실행될 것입니다. 여기서 assemblyname은 위와 같은 경우에는 Microsoft.VC90.CRT가 해당됩니다.

첫번째에 바로 검색될 수 있게 하기위해서는 참조하는 dll들을 자동으로 설치해주는 재배포 파일을 설치하면 됩니다. 재배포파일은 http://www.microsoft.com/downloads/deta ··· 62a191ee 에서 다운로드할 수 있습니다.

그런데 만약 Debug로 컴파일이 되었다면 Microsoft.VC90.DebugCRT가 더 추가되어 있을 것입니다.
제도 이것때문에 삽질을 했는데 분명 Release로 컴파일을 했는데. 컴파일 옵션에 _DEBUG가 들어가 있어서 일부가 Debug로 컴파일 되어서 manifest에서 DebugCRT를 요구했엇는데 VS 2005에서는 재배포 파일에 DebugCRT의 dll이 있는데 VS 2008 용 재배포 파일에는 Debug용은 CRT이든 MFC이든 모두 없으므로 아무리 설치를 했다고 해도 실행이 안되는 건 마찬가지 일 것입니다.

그 러므로 이를 해결하기 위해서는 Microsoft.VC90.DebugCRT를 해당 어플이 있는 디렉토리에 복사하던가 컴파일 시 Debug 정보가 없도록 해야 합니다.

Microsoft.VC90.DebugCRT는 <VS2008설치디렉토리>/VC/redist/Debug_NonRedist/x86/에 있습니다.
그리고 컴파일시에 Debug 정보가 있는지의 여부는 object 파일들이 생기는 중간 디렉토리 하위에 있는 manifest에 DebugXXX의 정보가 없으면 됩니다. 있다면 다시 한번 확인해 보세요.


이러한 해결법은 2005에서도 동일하게 적용됩니다. 재배포로 포함되는 dll들은 ATL, CRT, MFC, MFCLOC, OPENMP가 있습니다. 참조하세요.

일주일을 삽질한 결과입니다. ㅜㅜ

제가 문제를 해결할 때 참조한 사이트들입니다.

마이크로소프트에서 설명한 페이지
http://msdn.microsoft.com/ko-kr/library/ms235512.aspx
http://msdn.microsoft.com/ko-kr/library/ms235317.aspx 이는 설치형으로 프로그램을 배포해서 해결하는 방법입니다.

Side-by-side Assembly에 대해서 가장 잘 설명한 페이지
http://www.serious-code.net/moin.cgi/re ··· elibrary

저 하고 동일한 고민을 해결하는 과정이 그대로 적혀있군요. 전 이걸보고 힌트를 얻어서 해결할 수 있었습니다. ^^
http://www.panda3d.org/phpbb2/viewtopic ··· f64c61b5

신고

'빵꾸똥꾸 개발자 > Windows' 카테고리의 다른 글

win32 vc2005/2008 배포시 문제 해결  (0) 2010.03.24
[win32] libiconv 포팅하기  (0) 2010.03.17
Posted by 나마스떼

댓글을 달아 주세요

ibiconv 라이브러리는 GNU 프로젝트의 하나로 인코딩간의 변환을 지원한다. linux 계열의 소프트웨어에서 문자열 인코딩 변환은 전부 이 라이브러리로 이루어질 정도로, 아주 중요한 포지션을 담당하는 라이브러리이다. 예를 들어 php의 iconv() 함수는 최종적으로 이 라이브러리를 사용하게 된다.

Windows의 경우 인코딩 간 변환은 WideCharToMultiByte() 나 MultiByteToWideChar() 함수를 통해 할 수 있기 때문에 대부분의 경우 libiconv가 필요 없다. 하지만 Windows Mobile 환경에서는 OS 언어에 대한 문자열 변환만을 지원하기 때문에, libiconv와 같은 인코딩 변환 라이브러리가 필요해진다.

따라서 이 글에서는 libiconv를 Visual Studio에서 컴파일하는 방법을 살펴보기로 한다.

linux 쪽의 프로젝트를 포팅하는 경우에는 Visual Studio 프로젝트 파일을 어떻게 구성할지가 제일 난감하다. libiconv 의 경우도 어디서부터 손을 대어야 할지가 굉장히 난감했었는데, 소스 파일을 들여다 보면, 다행히도 대부분이 헤더 파일이고 c 파일은 몇 개 없다는 사실을 발견할 수 있다.

두번째로 다행인 점은 다른 오픈 소스 프로젝트와는 다르게, libiconv의 경우에는 몇 버전 전까지만 해도 Visual Studio 에서 native compile을 지원했었다. 하지만 아쉽게도, 이제는 mingw 프로젝트 때문에 win32용 응용 프로그램을 gcc로 컴파일할 수 있게 되어 더 이상 지원하지 않는다고 한다. 그러나 일단 VS용으로 터닦이 공사가 끝난 터라 큰 문제 없이 포팅 가능하다.

기본적으로 다음과 같은 수순으로 작업하면 된다. libiconv 1.13.1을 사용하였다.

  1. visual studio 에서 dll 프로젝트를 구성한다.
  2. 컴파일해야 하는 소스 파일은 3개.  lib/iconv.c  lib/relocatable.c libcharset/lib/localcharset.c   뿐이다. 컴파일 할 때 발생하는 include path 관련 에러를 모두 잡아준다.
  3. libcharset/include/libcharset.h.build.in 과 include/iconv.h.build.in 의 확장자를 수정하여 h 파일로 바꾼다. build.in을 사용하는 이유는 dll export 키워드를 넣어주기 위함이다.
  4. localcharset 에서 LIBDIR 관련 에러가 나는데, 주석으로 막아버린다.
  5. @HAVE_VISIBILITY@ 나 @DLL_VARIABLE@ @ICONV_CONST@ 따위가 있는데, 이건 autoconf 에서 자동으로 이름이 바뀌는 변수들로, 각각 없애고, 없애고, const로 바꿔주면 된다.

여기까지가 win32 용의 dll로 컴파일 하는 방법이다. 좀 더 자세한 변경 사항을 보고 싶다면, http://wiki.michgan.net/moin.cgi/iconv/Windows 을 본다.

Windows Mobile 용의 dll로 컴파일하려면 위의 작업에서 추가적으로 errno 변수 관련 작업을 해줘야 한다. Windows Mobile 에는 errno 변수가 없기 때문이다. 그냥 dll 내에서 int errno; 라고 선언하고 몇몇 매크로를 define 해주는 것으로 컴파일이 가능하다.
물론 errno 값을 dll 외부에서 확인하려면 조회할 수 있는 함수와 thread local storage에 저장이 되도록 구현해야겠지만, 에러 유무만 알면 됐지 뭐. diff 파일이 필요하다면 http://wiki.michgan.net/moin.cgi/iconv/WindowsMobile 을 본다.

이상으로 libiconv 프로젝트를 win32 용의 dll로 컴파일 하는 방법을 살펴 보았다.
참고로 libiconv는 LGPL 라이센스이다.

출처 : http://blog.michgan.net/49

신고

'빵꾸똥꾸 개발자 > Windows' 카테고리의 다른 글

win32 vc2005/2008 배포시 문제 해결  (0) 2010.03.24
[win32] libiconv 포팅하기  (0) 2010.03.17
Posted by 나마스떼

댓글을 달아 주세요



티스토리 툴바