증상 1.

 

이런 에러가 나온건.. CRT때문이라고 그러는데.. ATL이나 MFC를 사용하게되면
msvcrtd에서 이미 선언되었기때문에 그런거란다...

 

해결방법은 간단하다...
Project Setting에가서 Link탭에 Input으로 가면 ignore에가서 
LIBCMT.lib만 넣어주면된다...

----------------------------------------------------------------------------
LIBCMT.lib(crt0dat.obj) : error LNK2005: _exit already defined in msvcrtd.lib(MSVCRTD.dll)
LIBCMT.lib(crt0dat.obj) : error LNK2005: __exit already defined in msvcrtd.lib(MSVCRTD.dll)
LIBCMT.lib(winxfltr.obj) : error LNK2005: __XcptFilter already defined in msvcrtd.lib(MSVCRTD.dll)
LIBCMT.lib(atox.obj) : error LNK2005: _atoi already defined in msvcrtd.lib(MSVCRTD.dll)
LIBCMT.lib(getenv.obj) : error LNK2005: _getenv already defined in msvcrtd.lib(MSVCRTD.dll)
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_z already defined in msvcrtd.lib(cinitexe.obj)
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_a already defined in msvcrtd.lib(cinitexe.obj)
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_z already defined in msvcrtd.lib(cinitexe.obj)
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_a already defined in msvcrtd.lib(cinitexe.obj)
LIBCMT.lib(strcat.obj) : error LNK2005: _strcpy already defined in msvcrtd.lib(MSVCRTD.dll)
msvcrtd.lib(MSVCRTD.dll) : error LNK2005: __strdup already defined in LIBCMT.lib(strdup.obj)
msvcrtd.lib(MSVCRTD.dll) : error LNK2005: __setmbcp already defined in LIBCMT.lib(mbctype.obj)
LIBCMT.lib(crt0dat.obj) : warning LNK4006: _exit already defined in msvcrtd.lib(MSVCRTD.dll); second definition ignored
LIBCMT.lib(crt0dat.obj) : warning LNK4006: __exit already defined in msvcrtd.lib(MSVCRTD.dll); second definition ignored
LIBCMT.lib(winxfltr.obj) : warning LNK4006: __XcptFilter already defined in msvcrtd.lib(MSVCRTD.dll); second definition ignored
LIBCMT.lib(atox.obj) : warning LNK4006: _atoi already defined in msvcrtd.lib(MSVCRTD.dll); second definition ignored
LIBCMT.lib(getenv.obj) : warning LNK4006: _getenv already defined in msvcrtd.lib(MSVCRTD.dll); second definition ignored
LIBCMT.lib(crt0init.obj) : warning LNK4006: ___xc_z already defined in msvcrtd.lib(cinitexe.obj); second definition ignored
LIBCMT.lib(crt0init.obj) : warning LNK4006: ___xc_a already defined in msvcrtd.lib(cinitexe.obj); second definition ignored
LIBCMT.lib(crt0init.obj) : warning LNK4006: ___xi_z already defined in msvcrtd.lib(cinitexe.obj); second definition ignored
LIBCMT.lib(crt0init.obj) : warning LNK4006: ___xi_a already defined in msvcrtd.lib(cinitexe.obj); second definition ignored
LIBCMT.lib(strcat.obj) : warning LNK4006: _strcpy already defined in msvcrtd.lib(MSVCRTD.dll); second definition ignored
msvcrtd.lib(MSVCRTD.dll) : warning LNK4006: __strdup already defined in LIBCMT.lib(strdup.obj); second definition ignored
msvcrtd.lib(MSVCRTD.dll) : warning LNK4006: __setmbcp already defined in LIBCMT.lib(mbctype.obj); second definition ignored
Creating library Debug/RealImageConvert.lib and object Debug/RealImageConvert.exp
LINK : warning LNK4098: defaultlib "msvcrtd.lib" conflicts with use of other libs; use /NODEFAULTLIB:library
LINK : warning LNK4098: defaultlib "LIBCMT" conflicts with use of other libs; use /NODEFAULTLIB:library
LIBCMT.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/RealImageConvert.exe : fatal error LNK1120: 1 unresolved externals

출처 : http://kudak.egloos.com/

 

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

LIBC.lib(crt0init.obj) : error LNK2005: ___xc_z already defined in msvcrtd.lib(cinitexe.obj)
LIBC.lib(crt0init.obj) : error LNK2005: ___xc_a already defined in msvcrtd.lib(cinitexe.obj)
LIBC.lib(crt0init.obj) : error LNK2005: ___xi_z already defined in msvcrtd.lib(cinitexe.obj)
LIBC.lib(crt0init.obj) : error LNK2005: ___xi_a already defined in msvcrtd.lib(cinitexe.obj)
LIBC.lib(atox.obj) : error LNK2005: _atoi already defined in msvcrtd.lib(MSVCRTD.dll)
LIBC.lib(strtol.obj) : error LNK2005: _strtoul already defined in msvcrtd.lib(MSVCRTD.dll)
LIBC.lib(strcat.obj) : error LNK2005: _strcpy already defined in msvcrtd.lib(MSVCRTD.dll)
LIBC.lib(crt0init.obj) : warning LNK4006: ___xc_z already defined in msvcrtd.lib(cinitexe.obj); second definition ignored
LIBC.lib(crt0init.obj) : warning LNK4006: ___xc_a already defined in msvcrtd.lib(cinitexe.obj); second definition ignored
LIBC.lib(crt0init.obj) : warning LNK4006: ___xi_z already defined in msvcrtd.lib(cinitexe.obj); second definition ignored
LIBC.lib(crt0init.obj) : warning LNK4006: ___xi_a already defined in msvcrtd.lib(cinitexe.obj); second definition ignored
LIBC.lib(atox.obj) : warning LNK4006: _atoi already defined in msvcrtd.lib(MSVCRTD.dll); second definition ignored
LIBC.lib(strtol.obj) : warning LNK4006: _strtoul already defined in msvcrtd.lib(MSVCRTD.dll); second definition ignored
LIBC.lib(strcat.obj) : warning LNK4006: _strcpy already defined in msvcrtd.lib(MSVCRTD.dll); second definition ignored
   Creating library Debug/SCID.lib and object Debug/SCID.exp
LINK : warning LNK4098: defaultlib "msvcrtd.lib" conflicts with use of other libs; use /NODEFAULTLIB:library
LINK : warning LNK4098: defaultlib "LIBC" conflicts with use of other libs; use /NODEFAULTLIB:library
LIBC.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
D:\Projects\sf\ServiceServerDialog\Debug\Services\SCID\1.0\SCID.dll : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

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

내경우에는 앞에 충돌나는 라이브러리가 달라서 LIBC.lib를 제외시켜 주었다

 

증상 2.

 

내가 작성한 함수인데도 에러가 났을경우에

 

1. 헤더 파일에 선언과 정의를 동시에 할때 발생 할 수 있다. obj 링크 중복!!

해결법1.

( 프로젝트 속성 - 링커 - 명령줄 - /FORCE:MULTIPLE 입력 ) 무시하기-_-..

less..

/FORCE:[MULTIPLE|UNRESOLVED]

/FORCE 옵션을 사용하면 링커에서는 기호가 참조되어 있지만 정의되어 있지 않은 경우나 여러 번 정의되어 있는 경우에도 올바른 .exe 파일 또는 DLL을 만듭니다.

/FORCE 옵션에는 다음과 같이 선택적 인수를 사용할 수 있습니다.

  • /FORCE:MULTIPLE을 사용하면 LINK에서 기호에 대한 정의를 하나 이상 찾더라도 출력 파일을 만들 수 있습니다.
  • /FORCE:UNRESOLVED를 사용하면 LINK에서 정의되지 않은 기호를 찾더라도 출력 파일을 만들 수 있습니다. 진입점 기호가 확인되지 않으면 /FORCE:UNRESOLVED는 무시됩니다.

/FORCE에 인수를 사용하지 않으면 MULTIPLE과 UNRESOLVED를 모두 의미합니다.

이 옵션을 사용하여 만든 파일이 예상대로 실행되지 않을 수도 있습니다. 링커에서는 /FORCE 옵션이 지정된 경우 증분 링크를 수행하지 않기 때문입니다.

/clr를 사용하여 모듈을 컴파일하는 경우 /FORCE를 지정해도 이미지가 생성되지 않습니다.

Visual Studio 개발 환경에서 이 링커 옵션을 설정하려면

  1. 프로젝트의 속성 페이지 대화 상자를 엽니다.
  2. 링커 폴더를 클릭합니다.
  3. 명령줄 속성 페이지를 클릭합니다.
  4. 추가 옵션 상자에 옵션을 입력합니다.

http://msdn2.microsoft.com/ko-kr/library/72zdcz6f(VS.80).aspx

 

해결법2.

헤더파일에 선언을 소스파일에 정의를 나누면 댄다.

 

해결법3.

헤더파일에 있는 함수를 inline 예약어를 붙여준다.



또 다른 원인


1.링크하는 모든 라이브러리들을 디버그 모드 또는 릴리즈 모드로 통일시키지 않았거나 
2.런타임 라이브러리가 일치하지 않아서 생기는 경우가 대부분입니다. 

예를 들어, 작업중인 프로젝트는 릴리즈인데 디버그 모드로 컴파일된 라이브러리를 링크하는 경우, 
작업중인 프로젝트는 싱글 쓰레드인데 멀티 쓰레드로 컴파일된 라이브러리를 링크하는 경우, 
두가지 경우가 뒤섞인 경우가 있을 수 있겠습니다. 

간혹 위에서처럼 특정 라이브러리 무시 옵션을 주고 링크할 수는 있으나 
임시 방편일 뿐입니다. 
무시 옵션없이도 깨끗이 링크되어야 합니다. 
그렇지 않으면 나중에 문제가 발생할 수 있습니다. 
링크하는 라이브러리와 현재 작업중인 프로젝트 간의 설정(빌드 모드, 런타임라이브러리)이 일치하는 지 꼼꼼히 살펴보시기 바랍니다.


http://www.gpgstudy.com/forum/viewtopic.php?p=24947


또 다른 원인


MFC 공유 라이브러리 사용, MFC 정적 라이브러리 사용



또 다른 원인

Visual C++에서 CRT 라이브러리와 MFC 라이브러리가 잘못된 순서로 링크되면 LNK2005 오류가 발생

Posted by cyj4369
,