2010년 9월 1일 수요일

갑자기 VS2008 컴파일시 LNK2001 error가 뜬다면

LNK2001: ... 외부 기호를 확인할 수 없습니다.
LNK1120: 1개의 확인할 수 없는 외부 참조입니다.

혹은
디버그 모드에서 작업하고 있었으면
Microsoft Visual C++ Debug Library - Debug Assertion Failed!의 경고창이 뜰 수 있다.

문제가 없다고 생각한 프로젝트가 위와 같은 LNK2001이나 LNK1120 error가 뜬다면 당황하지 말고 아래와 같이 속성창을 확인하면 됩니다.

1. 프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 방법: 프로젝트 속성 페이지 열기를 참조하십시오.
2. 구성 속성 노드를 확장합니다.
3. 일반 속성 페이지를 클릭합니다.
4. 문자 집합 속성을 "멀티바이트 문자 집합 사용"으로 변경합니다.

위와 같은 문제가 발생하는 이유는 이전에 작성한 DLL이나 함수는 MBCS(Multi-Byte Character Set)로 작성되어 있고 현재의 프로젝트는 unicode(프로젝트를 새로 만들면 기본속성은 unicode가 된다)로 작성되었기 때문이다.
이 문제를 해결하려면 이전에 작성한 DLL이나 함수를 모두 unicode로 바꾸던가 현재 작성할 프로젝트를 MBCS로 하던가를 결정해야 한다. 물론 선택은 프로그래머가 해야 한다.

"멀티바이트 문자 집합 사용"으로 설정한 경우의 문제점은 XP 형태의 공용컨트롤(common controls)이 사라지고 예전에 쓰였던(XP 이전의) 공용컨트롤이 다시 나타나게 된다.
다시 XP 형태의 공용컨트롤이 나오게 하려면 "StdAfx.h"를 수정해야 한다.
파일 "StdAfx.h" 아래를 보면 #ifdef _UNICODE로 시작하는 구문이 보인다.

#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif

이 #ifdef _UNICODE 구문을 아래와 같이 삭제하면 원래의 XP 형태 공용컨트롤이 다시 나타난다.

//#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
//#endif

댓글 없음 :

댓글 쓰기

욕설이나 스팸글은 삭제될 수 있습니다. [전파거북이]는 선플운동의 아름다운 인터넷을 지지합니다.