WindowsSDK와 Visual Studio, Visual Studio Servicepack의 일부 include되는 파일셋은 서로 설치하면서 덮어 써집니다.
따라서, 가장 최신에 나온 파일이 가장 나중에 덮어 써지게 설치를 해야 합니다. Visual Studio2008을 예로 들면, 설치 순서는
Visual Studio2008 -> Visual Studio SDK 6.1 -> Visual Studio Service pack1 -> Security Update
순으로 이루어 져야 합니다.
특히 예전 Embedded C++로 개발할 때 온갖 툴과 SDK셋들을 설치 했을 때는 Embedded C++툴을 Visual Studio와 함께 설치 오더를 맞추어 줘야 했습니다. 설치 오더가 틀리면, 컴파일이 안되던가, 링크가 안되던가 등등 개발자를 당황스럽게 하는 문제를 발생시킵니다.
이번에 Visual Studio 2008 Servicepack1용 보안 업데이트인 MS09-035(http://support.microsoft.com/kb/971092)를 설치했을 때 설치 오더가 맞지 않을 경우 컴파일이 안 되는 문제가 있었습니다.
만일, Visual Studio Servicepack1를 설치한 후 SDK를 설치했을 때, 즉 Servicepack1의 최신 CRT파일을 SDK6.1의 구 CRT파일로 교체 된 다음 VisualStudio2008 Servicepack1용 ATL보안 업데이트를 하고 나면, vector를 사용한 소스 컴파일 시 아래와 같은 에러가 뜨게 됩니다.
|
error C2039: '_Swap_adl' : is not a member of 'std' c:\program files\microsoft visual studio 9.0\vc\include\xutility 2764 error C3861: '_Swap_adl': identifier not found c:\program files\microsoft visual studio 9.0\vc\include\xutility 2764 |
문제의 원인은 Visual Studio 2008 설치 후 Servicepack1을 설치해서 최신 CRT셋으로 교체 했지만, 그 후 SDK6.1에 있는 오리지날 Visual Studio2008 파일 셋으로 일부 CRT관련 파일이 롤백 되었고 Servicepack1용 보안 업데이트에서 교체한 CRT파일이 Servicepack1 CRT셋에서 추가된 파일을 사용하기 때문입니다.
문제 해결 방법은,
에러 메시지가 나타내주듯, C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xutility에 2764라인에서 사용된 _Swap_adl의 정의를 아래와 같이 _Swap_adl사용 시점 윗부분에 추가해 주던가,
|
// TEMPLATE FUNCTION _Swap_adl template<class _Ty> inline void _Swap_adl(_Ty& _Left, _Ty& _Right) { // exchange values stored at _Left and _Right, using ADL swap(_Left, _Right); } |
에러가 난 시점에서 Servicepack1과 보안업데이트를 순서대로 다시 설치해 주시면 됩니다.
SDK나 Servicepack을 설치할 때 설치 오더가 있다는 점을 분명히 알아 두시고, 설치시 Requirement부분을 참고 하시면 도움이 됩니다.
마찬가지 이유로, Servicepack, 보안 업데이트로 인해 최신 파일셋이 설치된 다음, SDK 인스톨파일로 SDK 복구를 하게 되면 다시 SDK파일 셋으로 롤백되니 파일셋을 복구 하실 때는 설치 오더를 고려해서 복구를 하셔야 합니다.
출처 : devpia.co.kr(데브피아 VC++ 마을)
atl.zip


