링크시 나는 에러 추적 하기
짜증나는 워닝과 에러 중에, 헤더파일 순서에 따라 발생하는 워닝/에러가 있습니다. 특히 링크타임에 나는 에러는 네이밍 모양새가 재밌게 생겨먹지 않은 스타일로 생기는 데다가 링커가 별로 힌트를 주지 않아서 짜증이 나기도 합니다. 예를 들면 아래와 같은 겁니다.
1>Generating Code... 1>Compiling resources... 1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1 1>Copyright (C) Microsoft Corporation. All rights reserved. 1>Compiling manifest to resources... 1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1 1>Copyright (C) Microsoft Corporation. All rights reserved. 1>Linking... 1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj) 1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj) |
위 예는 MFC프로젝트에서 모든 파일에서 MFC 헤더를 다른 헤더 보다 먼저 선언해야 하는데(대부분 stdafx.h를 가장 상위에 선언합니다.), 비 MFC 프로젝트에서 사용하던 파일을 Import 하고 컴파일 하는 순간 발생했습니다.
이런 에러의 경우 대처법은 의외로 간단 합니다. 일단 똑똑고 기억력 좋으신 분들은 자기가 했던 행위들의 콜스택을 하나하나 거슬러 올라가시면서 대처 하는법이 있고, 이게 가장 비용대비 시간단축 효가가 가장 좋습니다.
순간 욱해서 콜스택 거슬러 올라가기 힘드신 (저 같은;;)분들은 아래처럼 대처 하시면 됩니다. 먼저 링커 옵션에 아래 옵션을 추가 합니다.
/verbose:lib |
그리고 다시 빌드 하면 링킹타임에 library를 스캔하는 리스트가 아래와 같이 output창에 나오게 됩니다.
1>Generating Code... 1>Compiling resources... 1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1 1>Copyright (C) Microsoft Corporation. All rights reserved. 1>Compiling manifest to resources... 1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1 1>Copyright (C) Microsoft Corporation. All rights reserved. 1>Linking... 1>Searching libraries 1> Searching C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\DelayImp.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\uuid.lib: 1> Searching C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\LIBCMTD.lib: 1> Searching C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\OLDNAMES.lib: 1> Searching C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\lib\uafxcwd.lib: 1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj) 1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj) 1> Searching C:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\kernel32.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\user32.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\gdi32.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\uuid.lib: |
윗 예에서 uafxcwd.lib를 링크 할 때, 링크에러가 났고, 에러를 유발한 유력한 용의자는 uuid.lib입니다. 왜냐면, 계속 다른 애들은 디폴트 경로에서 링크되는데 uuid.lib만 sdk 에서 링크 되었고, MFC에서 new를 재정의 하기 때문에, 이전에 new가 정의되어 있는 파일이 링크되면 안됩니다. 여기서 “stdafx.h”파일을 추가 하는 것을 잊었구나 하는 생각이 듭니다.
/verbose 옵션을 써보지 않으신 분들은 한번 넣고 컴파일을 해보시면 쓰잘떼기 없는 정보까지 주르륵 나와서 놀라실 껍니다. 여러가지 링킹 타임에 하는 작업 정보를 자세히 알려주는 것을 알 수 있습니다. 윗예의 :lib처럼 뒷부분에 세부 옵션을 붙여 보기 좋게 정보를 추출하는 작업이 익숙해 지면 일반적인 컴파일시 정보를 잘 제공해주지 않는 링킹 타임시 발생하는 에러에 정보를 얻어 디버깅 작업 시간을 단축 시킬 수 있습니다.
출처 : http://blog.naver.com/drvoss/20064150564
'Tip & Tech > VS 프로젝트 설정' 카테고리의 다른 글
warning D9035 : 'Wp64' 옵션은 더 이상 사용되지 않으므로 이후 릴리스에서 제거될 예정입니다 (3) | 2011.03.03 |
---|---|
Visual Studio 2008 Release 모드에서 디버깅 하기 (0) | 2011.02.18 |
lib 충돌 관련해서.. 어떤것이 충돌되었는지 확인하는 옵션 (0) | 2011.02.08 |
link error 해결 방안 모색 (0) | 2011.02.08 |
디버깅에 도움을 주는 컴파일러와 링커옵션 정리 (0) | 2011.01.07 |