LNK2005 "public: __thiscall CSize::CSize(void)" 이(가) atltypes.obj에 이미 정의되어 있습니다.

비주얼 스튜디오 2008에서 2015로 마이그레이션 중 아래와 같은 에러가 있었습니다.

LNK2005 "public: __thiscall CSize::CSize(void)" 이(가) atltypes.obj에 이미 정의되어 있습니다.

CSize는 MFC에서 많이 보던 놈인데 왜 win32 프로젝트에서 저런 에러가 날까 싶더군요. 링크에러가 발생하는 atltypes 키워드로 검색을 해보니 아래와 같이 2가지 타입이 나왔습니다.

#include "atltypes.h"
#include <AtlTypes/atltypes.h>

어떤곳은 atltypes.h로 어떤곳은 AtlTypes/atltypes.h로 사용중인데 atltypes.h은 Visual Studio 설치된 곳에 있는 include 파일입니다.

c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\include\atltypes.h

AtlTypes/atltypes.h의 경우는 MS의 atltypes.h를 가져와서 자체적으로 약간 수정해서 만든 파일이더군요. 뭐 아래와 같이 CSize 같은게 또 있더군요.

class CSize : public tagSIZE
...

왜 이래놨는지.... 아무튼 자체 h 인 #include <AtlTypes/atltypes.h> 를 사용하게 바꿔주면 링크에러는 사라집니다.

보통은 아래와 같이 inline 문제 이거나 h 파일에 변수를 선언해놓고 중복 으로 include를 해서 사용했을 때 발생하긴 합니다.

inline 때문에 생긴 error LNK2005
error LNK2005가 또 날 괴롭히는구나

이 블로그의 인기 게시물

Unity3D Prime31 처럼 자신만의 안드로이드 플러그인을 만들어보자

CMake Windows에 설치하기

Unity3D iOS Plugin 만들어 연동하기