관리 메뉴

드럼치는 프로그래머

[API/MFC] LNK2005 에러 처리 본문

★─Programing/☆─API | MFC

[API/MFC] LNK2005 에러 처리

드럼치는한동이 2013. 6. 4. 10:57

역시.. LNK2005에 대한 error message로 인하여.. 거의 반나절이나 되는 시간을 까먹었다.
이렇게 편한 internet이 있는줄도 모르고...... 문명의 뒤에 있는 듯한 이 느낌...... T.T
여튼 아래와 같은 이유로 LNK2005 error가 발생한다.
아래와 같은 이유로.. 알아서.. 해결할 수도 있겠다..

---------------------------------------------------------------------------------------------------------------------

발췌 : http://blog.naver.com/rinbo7

MS Visual Studio를 사용하다가 다음과 같은 링크 에러를 보았다.

 

msvcrt.lib(MSVCRT.dll) : error LNK2005: _atoi already defined in libcmt.lib(atox.obj)

msvcrt.lib(MSVCRT.dll) : error LNK2005: _strchr already defined in libcmt.lib(strchr.obj)

msvcrt.lib(MSVCRT.dll) : error LNK2005: _strstr already defined in libcmt.lib(strstr.obj)

msvcrt.lib(MSVCRT.dll) : error LNK2005: __stricmp already defined in libcmt.lib(stricmp.obj)

msvcrt.lib(MSVCRT.dll) : error LNK2005: __setmbcp already defined in libcmt.lib(mbctype.obj)

nafxcw.lib(nolib.obj) : warning LNK4098: defaultlib "mfc42.lib" conflicts with use of other libs; use /NODEFAULTLIB:library

nafxcw.lib(nolib.obj) : warning LNK4098: defaultlib "mfcs42.lib" conflicts with use of other libs; use /NODEFAULTLIB:library

libcmt.lib(crt0init.obj) : warning LNK4098: defaultlib "msvcrt.lib" conflicts with use of other libs; use /NODEFAULTLIB:library

 

위에서 중복 선언되었다고 하는 함수들은 CRT library인데 뭐가 중복 선언되었다고 하는 것인지 알 수가 없어 한참을 삽질하다가 해결책을 구글링을 통해 발견했다.

 

 

- 발췌문 -

 

프로그램에서 사용되는 모든 라이브러리의 형태를 일치 시켜야 합니다. 윈도우 라이브러리는 3가지 형태가 있다네요.

 

1. 싱글쓰레드, 정적 라이브러리 링크 : /ML : libc*.* 이용

2. 멀티쓰레드, 정적 라이브러리 링크 : /MT : libcmt*.* 이용

3. 멀티쓰레드, 동적 라이브러리 링크 : /MD : msvcrt*.* 이용


그런데 중요한 것은 위의 3가지 형태의 라이브러에 동일한 함수들이 존재한다는 거죠. 그래서 링크도중에 2개 이상의 파일을 찾게되면 당연이 중복으로 존재하는 함수가 존재하게 되어 충돌하게 됩니다.

 

이를 원천적으로 해결하려면 프로젝트에 연관된 모든 프로그램을 3가지 중 한가지 형태로 빌드를 하면됩니다. 제작 중인 프로젝트에 사용되는 모든 라이브러리도 동일한 링크 형태로 빌드된 것이 링크되면 됩니다.


예를 들어서 dll을 사용하는 프로젝트가 /MDd 옵션을 사용하여 컴파일 한다면 이 프로젝트에서 사용되는 모든 라이브러리도 /MDd로 컴파일 된것을 준비해야 합니다.

 

Comments