본문 바로가기
나머지/IT개발.잡다한것.

LNK4098 LNK2019 관련 포스팅

by 무늬만학생 2013. 1. 2.
반응형

에러

1>LIBCMT.lib(sprintf.obj) : error LNK2005: _sprintf already defined in msvcrtd.lib(MSVCR100D.dll)

1>LIBCMT.lib(sprintf.obj) : error LNK2005: _sprintf_s already defined in msvcrtd.lib(MSVCR100D.dll)

1>LIBCMT.lib(tidtable.obj) : error LNK2005: __encoded_null already defined in msvcrtd.lib(MSVCR100D.dll)

1>LIBCMT.lib(mlock.obj) : error LNK2005: __unlock already defined in msvcrtd.lib(MSVCR100D.dll)

1>LIBCMT.lib(mlock.obj) : error LNK2005: __lock already defined in msvcrtd.lib(MSVCR100D.dll)

1>LIBCMT.lib(winxfltr.obj) : error LNK2005: ___CppXcptFilter already defined in msvcrtd.lib(MSVCR100D.dll)

1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __initterm_e already defined in msvcrtd.lib(MSVCR100D.dll)

1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __amsg_exit already defined in msvcrtd.lib(MSVCR100D.dll)

1>LIBCMT.lib(hooks.obj) : error LNK2005: "void __cdecl terminate(void)" (?terminate@@YAXXZ) already defined in msvcrtd.lib(MSVCR100D.dll)

1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_a already defined in msvcrtd.lib(cinitexe.obj)

1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_z already defined in msvcrtd.lib(cinitexe.obj)

1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_a already defined in msvcrtd.lib(cinitexe.obj)

1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_z already defined in msvcrtd.lib(cinitexe.obj)

1>LINK : warning LNK4098: defaultlib 'msvcrtd.lib' conflicts with use of other libs; use /NODEFAULTLIB:library

1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library

1>LIBCMT.lib(crt0.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup

1>C:\File\Dev\USB\Image\GrayImage\GrayImage\Debug\GrayImage.dll : fatal error LNK1120: 1 unresolved externals





warning libcmt.lib

해결방법
같은 모드로 컴파일한 라이브러리와 메인코드를 링크
메인프로젝트의 디폴트라이브러리를 몇개 무시
프로젝트 옵션에서 경고가 지적해준데로 /NODEFAULTLIB:????.lib

각 컴파일 모드 별로 무시해야 하는 라이브러리

To use this run-time library Ignore these libraries

 사용할 런타임 라이브러리

 무시해야 하는 라이브러리
단일 스레드(libc.lib)  libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib
  다중 스레드(libcmt.lib)  libc.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib
DLL을 사용하는 다중 스레드
(msvcrt.lib)
 libc.lib, libcmt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib
  디버그 단일 스레드(libcd.lib)  libc.lib, libcmt.lib, msvcrt.lib, libcmtd.lib, msvcrtd.lib
디버그 다중 스레드(libcmtd.lib)  libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, msvcrtd.lib
  DLL을 사용하는 디버그 다중 스레드
(msvcrtd.lib)
 libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib


예제 : /NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:msvcrt.lib /NODEFAULTLIB:libcd.lib /NODEFAULTLIB:libcmtd.lib /NODEFAULTLIB:msvcrtd.lib

출처 :  http://blog.bagesoft.com/221
출처 :  MSDN   http://msdn.microsoft.com/ko-kr/library/6wtdswk0(v=vs.100).aspx


LNK2019에러에 대해
http://sadiles.blog.me/10072075057




Resolving LNK4098: defaultlib 'MSVCRT' conflicts with
CRT란 C Run-Time Lib
출처 : http://stackoverflow.com/questions/3007312/resolving-lnk4098-defaultlib-msvcrt-conflicts-with



런타임 라이브러리
[C/C++] - [코드 생성] - [런타임 라이브러리]를 보면 아래와 같이 4가지 선택 사항이 있다.
 
- 다중 스레드(/MT) : 릴리즈 모드시. 정적으로 링크
- 다중 스레드 디버그(/MTd) : 디버그 모드시. 정적으로 링크
- 다중 스레드 DLL(/MD) : 릴리즈 모드시. 동적으로 링크
- 다중 스레드 디버그 DLL(/MDd) : 디버그 모드시. 동적으로 링크
 
다중 스레드 디버그(/MTd)로 변경한 경우, 만일 MFC를 사용하고 있는 경우,
[속성] - [일반] - [MFC 사용]을 정적 라이브러리에서 MFC 사용 으로 변경해야함
 
왜냐하면, 라이브러리를 링크할 때 정적으로 해주도록 했으니, 라이브러리를 쓸 경우도 정적 라이브러리를 쓰도록 변경해줘야 하는 것이다.
출처 :  http://blog.naver.com/PostView.nhn?blogId=ksa3824&logNo=70124184896

반응형