정말... 마이그레이션 하나 하는거 힘드네요 ㅠㅠ

이번엔 몇몇 라이브러리에서

 

error C2825: '_Fty': '::'가 뒤에 나오면 클래스 또는 네임스페이스여야 합니다.

이런식으로 뭔가 알지도 못하는 xxresult(28) 파일을 찾아봐염

 

에러가 떨어졌습니다.

 

아무리 이 파일 안을 봐도 뭔가 복잡한 코드라는것 밖에 알 수 없어서

이넘이 컴파일 하다 죽은 소스 부분을 살펴보다가 이런 부분이 나오더군요.

 

error C2678: 이항 '==' : 왼쪽 피연산자로 'std::tr1::_Bind_fty<_Fty,_Ret,_BindN>' 형식을 사용하는 연산자가 없거나 허용되는 변환이 없습니다.
1> with
1> [
1> _Fty=SOCKET,
1> _Ret=std::tr1::_Notforced,
1> _BindN=std::tr1::_Bind2<std::tr1::_Callable_obj<SOCKET,false>,sockaddr *,unsigned int>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\exception(470): 'bool std::operator ==(const std::_Exception_ptr &,const std::_Exception_ptr &)'일 수 있습니다.
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\exception(475): 또는 'bool std::operator ==(std::_Null_type,const std::_Exception_ptr &)'
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\exception(481): 또는 'bool std::operator ==(const std::_Exception_ptr &,std::_Null_type)'
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\system_error(408): 또는 'bool std::operator ==(const std::error_code &,const std::error_condition &)'
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\system_error(416): 또는 'bool std::operator ==(const std::error_condition &,const std::error_code &)'
1> C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\guiddef.h(192): 또는 'int operator ==(const GUID &,const GUID &)'
1> 인수 목록 '(std::tr1::_Bind_fty<_Fty,_Ret,_BindN>, int)'을(를) 일치시키는 동안
1> with
1> [
1> _Fty=SOCKET,
1> _Ret=std::tr1::_Notforced,
1> _BindN=std::tr1::_Bind2<std::tr1::_Callable_obj<SOCKET,false>,sockaddr *,unsigned int>
1> ]

 

 

이게 뭔말인고 하니

#include <Winsock2.h> 에서 정의된 bind 랑

#include <functional> 에서 정의된 bind가 같은 네임스페이스 상에 있어서 충돌하는거라 하네요..

 

자세한건

  https://connect.microsoft.com/VisualStudio/feedback/details/500364/how-to-avoid-conflicts-between-tr1-bind-and-winsock-bind-function

에 설명하고 있습니다.

 

뭐 어쨋든.. 저걸 해결하기 위해서 stl이 아닌 bind를 쓰고 싶으면 bind -> ::bind로 바꿔서

지금 bind는 소켓 통신용이다 라는걸 알려줘야 한다는군요.....

 

ㅡㅡ.... 헐..... vs2010.....

 

출처 : http://vsts2010.net/411

 

VS.NET(VS2002)에서MFC 프로젝트로 만들었던 프로그램을 VC++10 프로젝트로 변환하여 컴파일 했더니 에러가 발생하면서 아래의 경고가 나왔습니다.

C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\include\atlcore.h(35):#error This file requires _WIN32_WINNT to be #defined at least to 0x0403. Value 0x0501 or higher is recommended.

에러 내용은 프로젝트에서 정의된 _WIN32_WINNT 버전이 0x403인데atlcore.h 버전이 최소 0x0501 이상이 되어야 한다는 것입니다.

그래서 _WIN32_WINN 정의한 stdafx.h 파일을 열어보니

#define _WIN32_WINNT 0x0400

되어 있었더군요. 그래서 일단 이것을 최신이 좋다라는 생각에 아래와 같이 했습니다. ^^;;

#define _WIN32_WINNT 0x0600

그랬더니 이제는 아래와 같은 에러가 나오더군요. -_-;

c:\program files\microsoft visual studio 10.0\vc\atlmfc\include\afxcmn3.inl(29): error C2065: 'CCM_SETWINDOWTHEME' : 선언되지 않은 식별자입니다.

그래서 바로 구글링 들어갔습니다.

쉽게 저와 같은 에러가 나와서 질문을 올린 글을 찾았고 답변도 보았습니다.

문제 해결은 stdafx.h 파일에 정의된 버전의 숫자를 아래와 같이 하면 된다고 하더군요

// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#ifndef WINVER // Allow use of features specific to Windows 95 and Windows NT 4 or later.
#define WINVER 0x0501 // Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
#endif

#ifndef _WIN32_WINNT // Allow use of features specific to Windows NT 4 or later.
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
#endif

#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later.
#define _WIN32_WINDOWS 0x0501 // Change this to the appropriate value to target Windows Me or later.
#endif

#ifndef _WIN32_IE // Allow use of features specific to IE 4.0 or later.
#define _WIN32_IE 0x0500 // Change this to the appropriate value to target IE 5.0 or later.
#endif

이렇게 하니 문제 없이 빌드가 성공 되었습니다.

주위에서 VC++의 새로운 버전이 나와도 쉽게 사용하지 못하는 경우가 오래 전에 만들었던 프로젝트를 포팅 할 수 없어서 이전 버전을 어쩔 수 없이 사용한다는 이야기를 종종 듣습니다.

그러나 저는 운이 좋아서인지 2002버전부터 순차적으로 새 버전의 VC++을 사용할 수 있어서 VC++6에서 VS2002로 넘어갈 때만 빌드 문제를 겪었습니다.

그래서 이런 포팅에 대한 문제는 잘 알지 못합니다. 이번에는 예전에 만들었던 코드를 C++0x 코드로 바꾸고 싶어서 오래 전에 만들었던 프로젝트를 VC++ 10로 포팅하면서 정말 정말 오랜만에 이런 문제를 겪어 보게 되고 해결 방법을 포스팅 할 수 있었습니다.

혹시 앞으로 또 이런 경우가 발생하면 바로 바로 공유하도록 하겠습니다.

 

회사에서 작업으로 받은 컴퓨터가 더 이상 작업하는데 인내심을 요구해서

(팬4 RAM 2GB ... ㅡㅡ... 아무리 장인은 연장탓을 안한다곤 하지만.. 기획자들은 i7에 ssd 보급해주면서 참...  )

현재 안쓰는 테스팅 컴퓨터가 굴러다니길래 (쿼드Q8300 RAM 5GB) 여기에

윈7 64bit 를 설치하고, 가능한 최신 컴파일러의 힘을 보고싶어서 Visual Studio도 2005 -> 2010으로 올렸습니다.

 

그런데.....

가뜩이나 빌드 환경을 적용 시키고

Lua 의 LNK2001 _lua ... 의 에러도 일일히 lib 파일을 지정 시켜서 서버 프로그램 빌드를 성공 시키는건 좋았습니다만...

 

이걸 테스트 서버 (윈2003) 에서 돌리니 프로그램이 걍 죽어 버리더군요.

 

처음엔 64비트로 컴파일 환경이 바껴서 그런가 해서 컴파일 옵션에서 전부 x86환경으로 맞췄는데 결과는 똑같아서

천상 원격 디버깅 까지 해가면서 원인을 찾아보니

 

CADODataBase::CADODataBase()
{
     ::CoInitialize(NULL);
     m_pConnection.CreateInstance(__uuidof(Connection));
     if( m_pConnection == NULL ){ 
          ASSERT(false && "CoInitialize() 를 먼저 호출해야합니다.");
          LOGCON(_T("[CADODataBase][ERROR][ADODB.Connection]\n"));  
     }
}

 

위의 ASSERT에서 죽어버리더군요.

 

그런데... 이게, 컴파일한 win7환경에선 전혀 문제없이 객체 할당에 성공시키니 뭐가 문제일까 하고 열심히 검색하던중

저랑 같은 증상으로 고생하신 분이 계시더군요.

(참고한분 블러그 입니다. http://icartsh.tistory.com/3)

 

결론은 msado15.dll 이 윈7이전이랑 이후 버젼이 있어서 만약 이후 버젼에서 컴파일 하면 위와 같은 함수에서 객체 생성에 실패할 수 도 있다는 이야기 입니다.

 

ms에선 이렇게 설명하고 있습니다.

http://support.microsoft.com/kb/2517589

 

 C:\Program Files\Common Files\System\ado

 

msado15.dll

 

실제로 저 파일의 타임 스템프가 2010년으로 찍혀 있고, 용량도 2배로 늘어있더군요.

MS가 무슨짓을 했는지 잘 모르지만, 해당 폴더의 원래 있던 msado15.dll 을 msado15_win7.dll 로 바꿔준뒤

저 파일을 다운 받아 재 컴파일 해서 테스트 해보니 이상없이 돌아가네요.

 

ㅜㅜ... 이것땜에 하루가 또... ㅠㅠ

+ Recent posts