본문 바로가기

C..C++....

error LNK 2005 xxxx이(가) MSVCPRT(D).lib 혹은 LIBCPMT(D).lib 에 이미 정의되어 있습니다.. 오류날때 대처방법


 2011/06/13 - [C..C++....] - error LNK 2005 xxxx이(가) MSVCRT(D).lib 혹은 LIBCMT(D).lib 에 이미 정의되어 있습니다.. 오류날때 대처방법




MSVCPRT(d).LiB나 LIBCPMT(d).LIB 도 위에 나온 글과 같은 세팅문제로 생기는 문제입니다..

MSVCRT.LIB나 LIBCMT.LIB는  C Run-Time Libaray(CRT)에 관련된 파일이고

MSVCPRT(d).LiB나 LIBCPMT(d).LIB는 Standard C++ Libaray로 인해 생기는 문제입니다..

이러한 문제가 생기는 원인을 간략히 설명하자면..

msvcrt 같은경우는 c 에서 사용하던 함수
예를들어 printf로 설명을 드리면
printf함수 하나를 가지고 총 6가지의 라이브러리를 만들게 됨니다.(vs2005이상에서는 4개)
싱글쓰레드,다중쓰레드,다중쓰레드 DLL, 여기에 디버그 버전까지 총 6개가 만들어지는데..

외부 라이브러리에서는 다중쓰레드로 컴프알 되었으면 그곳에서 printf는 libcmt.lib로 컴파일 되었고.
내가 사용하는 라이브러리는 다중쓰레드dll로 사용되었다면 내 프로젝트는 msvcrt.lib로 사용하게 됨니다..
그러면 libcmt.lib msvcrt.lib가 서로 printf를 가지고 있으므로 중복에러가 발생하게 되는것이지요...

msvcprt.lib나 libcpmt.lib같은 경우엔 printf가 아니라 c++함수인 cout같은게 서로 중복되어서 생기는 문제이고요..

http://msdn.microsoft.com/ko-kr/library/abx4dbyh(v=VS.100).aspx

이곳에 가시면 더욱더 자세한 정보를 얻으실수 있습니다..

프로젝트 세팅하실때 다중쓰레드를 사용중이시라면(릴리즈기준.. 디버그는 끝에 D만 붙여주면됨)
링크->입력->특정 기본라이브러리 무시 이곳에 msvcrt.lib;msvcprt.lib를 적어주시면 되고.
다중쓰레드 dll일경우엔 libcmt.lib;libcpmt.lib를 적어주시면 됨니다.


프로젝트가 다중 스레드인지 다중스레드 DLL인지 확인하는 방법은
속성->C/C++ -> 코드 생성 -> 런타임 라이브러리에서 확인하시면 됨니다.