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)

LIBC.lib(crt0dat.obj) : error LNK2005: _exit already defined in msvcrt.lib(MSVCRT.dll)
LIBC.lib(crt0dat.obj) : error LNK2005: __exit already defined in msvcrt.lib(MSVCRT.dll)
LIBC.lib(crt0init.obj) : error LNK2005: ___xc_z already defined in msvcrt.lib(cinitexe.obj)
LIBC.lib(crt0init.obj) : error LNK2005: ___xc_a already defined in msvcrt.lib(cinitexe.obj)
LIBC.lib(crt0init.obj) : error LNK2005: ___xi_z already defined in msvcrt.lib(cinitexe.obj)
LIBC.lib(crt0init.obj) : error LNK2005: ___xi_a already defined in msvcrt.lib(cinitexe.obj)

LNK2005 에러의 원인은..
사용한 라이브러리가 현재 컴파일한 모드가 같지 않기 때문입니다.
프로그램에서 사용되는 모든 라이브러리의 형태를 일치 시켜야 합니다.
윈도우 라이브러리는 3가지 형태가 있다네요.
 

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

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

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


그런데 중요한 것은 위의 3가지 형태의 라이브러에 동일한 함수들이 존재한다는 거죠. 그래서 링크도중에 2개 이상의 파일을 찾게되면 당연이 중복으로 존재하는 함수가 존재하게 되어 충돌하게 됩니다.
 
이를 원천적으로 해결하려면 프로젝트에 연관된 모든 프로그램을 3가지 중 한가지 형태로 빌드를 하면됩니다. 제작 중인 프로젝트에 사용되는 모든 라이브러리도 동일한 링크 형태로 빌드된 것이 링크되면 됩니다.

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

Debug모드로 컴파일한 라이브러리는 Debug에서 사용해야 제대로 동작하고, Release모드에서 컴파일한 라이브러리는 Release에서 사용해야 제대로 동작합니다.

마지막으로..

MFC6.0 기준으로..

Project -> Settings 에서..

Debug와 Release 모두..

Microsoft Foundation Classes: 항목이

Use MFC in a Shared DLL으로 설정되었는지 확인하시고..

아니면 설정을 마치고 컴파일한 라이브러리를 사용하셔서..

다시 시도해 보십시오.

(*) http://yunhyeon.tistory.com/51 에서 인용함

+ Recent posts