정리

error LNK2005 - uafxcw.lib, LIBCMT.lib

저장소/VC++


다음과 같은 문제가 발생.


1>uafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z)이(가) LIBCMT.lib(new.obj)에 이미 정의되어 있습니다.

1>uafxcw.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z)이(가) LIBCMT.lib(delete.obj)에 이미 정의되어 있습니다.


C Runtime Library와 MFC Library의 import 순서에 의한 링크시 오류라고 한다.

일단 해결 방법은 다음과 같이 하여 import 순서를 변경해주면 되겠다.


프로젝트 속성 -> 링커 -> 입력 -> 특정 기본 라이브러리 무시 : uafxcwd.lib; libcmtd.lib

프로젝트 속성 -> 링커 -> 입력 -> 추가 종속성 : uafxcwd.lib; libcmtd.lib


링크 옵션 /verbose:lib 를 통해 설정 전후의 Library Import 순서를 확인할 수 있다.

설정 전
1>  라이브러리를 검색하고 있습니다.
1>      C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\LIBCMTD.lib 검색 중:
1>      C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\OLDNAMES.lib 검색 중:
1>      C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\lib\uafxcwd.lib 검색 중:
1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z)이(가) LIBCMTD.lib(new.obj)에 이미 정의되어 있습니다.
1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z)이(가) LIBCMTD.lib(dbgdel.obj)에 이미 정의되어 있습니다.
1>      C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\kernel32.lib 검색 중:
...

설정 후
1>  라이브러리를 검색하고 있습니다.
1>      C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\lib\uafxcwd.lib 검색 중:
1>      C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\libcmtd.lib 검색 중:
1>      C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\OLDNAMES.lib 검색 중:
1>      C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\kernel32.lib 검색 중:


그러하다!


[펌] 링크시 나는 에러 추적 하기

저장소/VC++

원문 출처 : 샤방샤방님 블로그(http://blog.naver.com/drvoss/20064150564)



짜증나는 워닝과 에러 중에헤더파일 순서에 따라 발생하는 워닝/에러가 있습니다특히 링크타임에 나는 에러는 네이밍 모양새가 재밌게 생겨먹지 않은 스타일로 생기는 데다가 링커가 별로 힌트를 주지 않아서 짜증이 나기도 합니다예를 들면 아래와 같은 겁니다.

 

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처럼 뒷부분에 세부 옵션을 붙여 보기 좋게 정보를 추출하는 작업이 익숙해 지면 일반적인 컴파일시 정보를 잘 제공해주지 않는 링킹 타임시 발생하는 에러에 정보를 얻어 디버깅 작업 시간을 단축 시킬 수 있습니다.


[Error/Warnning] error LNK2005

저장소/VC++
런타임 라이브러리 설정에 따른 문제 사항으로 이도 저도 안 될 경우 특정 라이브러리를 무시하도록 설정해야만 해결이 가능하다.
다음은 런타임 라이브러리 설정에 따른 무시해야 하는 라이브러리 목록이다.

Single Thread(libc.lib)
 - libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib

Single Thread Debug(libcd.lib)
 - libc.lib, libcmt.lib, msvcrt.lib, libcmtd.lib, msvcrtd.lib

Multi Thread(/MT, libcmt.lib)
 - libc.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib

Multi Thread Debug(/MTd, libcmtd.lib)
 - libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, msvcrtd.lib

Multi Thread DLL(/MD, msvcrt.lib)
 - libc.lib, libcmt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib

Multi Thread DLL(/MDd, msvcrtd.lib)
 - libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib


프로젝트 설정에 따라 관련 라이브러리를 무시하도록 설정해주면 된다.

'저장소 > VC++' 카테고리의 다른 글

[Win32 API] Window Styles  (0) 2011.10.10
[MFC] CFileDialog 사용 주의점  (0) 2011.09.23
Visual C++ 컴파일러 버전  (0) 2011.04.29
Delay Load 관련 내용  (0) 2011.04.27
[Win32 API] File Version 확인  (0) 2011.02.22