libcmtd.lib LNK2005 - 중복 선언 에러


libcmtd.lib LNK2005 - 중복 선언 에러 | 니가 C 맛을 알아? 포스트 삭제 2005/12/12 14:27
http://blog.naver.com/pro301/50000207598

* LIBCMTD.lib 중복 선언에러(LNK2005)  : CRT (* 표준 C/C++ 런타임 라이브러리 참조)

에러원인 :
 CRT 라이브러리가 MFC 라이브러리 전에 링크되면 LNK2005 오류가 발생한다.
 MFC나 VC관련 라이브러리와 동일한 함수가 CRT에도 존재하기 때문에 발생되는 에러이다.

에러메시지 :
 nafxcwd.lib(afxmem.obj) : 오류 LNK2005:"void * __cdecl operator new(unsigned int)"(??2@YAPAXI@Z)이(가) LIBCMTD.lib(new.obj)에 이미 정의되어 있습니다.

해결방법 :
 CRT 라이브러리 링크 무시.
 VC98 : Project -> Setting 메뉴에 Link탭에서  프로젝트 옵션에 /nodefaultlib:"libcmtd.lib" 를 아무데나 삽입

 .NET : Linker -> Input 메뉴에서 IgnoreSpecific Library에 libcmtd.lib 입력
 링커 명령줄은 /NOD:libcmtd.lib 명령과 동일


링크 순서를 확인하는 방법 :
 1. Project 메뉴에서 Settings을 눌러 Project Settings 대화 상자를 엽니다.
 2. Settings For 뷰에서 링크 오류가 발생하는 프로젝트 구성을 선택(강조 표시)합니다.
 3. Link 탭을 누릅니다.
 4. Project Options 대화 상자에 다음을 입력합니다. /verbose:lib
 5. 프로젝트를 다시 빌드. 링크하는 과정에서 출력 창에 라이브러리가 표시됩니다.


==========================================================================================

 

MSDN 이나 일반적인 해결방법은 위와 같다....

하지만, 프로젝트 옵션을 써서 극복하려는 시도는 궁극적인 해결 방법은 아닌 것 같다.

 

대개 위와 같은 링크에러는 여러개의 라이브러리가 포함된 프로젝트에서 발견된다.

그 문제가 아니라면 관련글[http://blog.naver.com/post/postList.jsp?blogId=pro301&categoryNo=4&cpage=9&viewdate=]의

순서에 따라 해결 하면 될 것이다.


내가 생각하는 궁극적인 해결방법은...

주 프로젝트에 디펜던시로 묶인 프로젝트들이 모두 동일한 dll사용옵션을 사용했는가 이다.

.NET 에서는 프로젝트 속성 - MFC 사용 부분에서
공유DLL 사용과 정적라이브러리 사용을 선택할 수가 있다.

사용될 라이브러리에서는 [공유 dll 사용]옵션을 선택한 상태에서,
주 프로젝트에서는 Release모드로 빌드하면서 MFC 사용옵션을 [정적라이브러리 사용]으로 선택하게 되면 중복선언에러(LNK2005)의 링크에러가 발생한다.

 


해결방법은 Release 모드 컴파일시.

Release모드의 사용 라이브러리도 모두 [정적 라이브러리 사용]으로 바꾼 후 빌드하면 LNK2005는 발생하지 않는다.

1) .NET C++ : 프로젝트속성(Alt+P,P) - 일반 - MFC 사용 => [정적 라이브러리 사용]
2) VC++ 6 : Project Setting(Alt+F7) - General(Tab) - Microsoft Foundation Classess => [Use MFC in a Static Library]로 선택.







기술 자료 ID : 148652
마지막으로 검토한 날짜 : 2003년 2월 3일 월요일
수정 : 1.0
현상
CRT(C 런타임) 라이브러리와 MFC(Microsoft Foundation Class) 라이브러리가 잘못된 순서로 링크되면 다음과 비슷한 LNK2005 오류가 발생할 수 있습니다.
nafxcwd.lib(afxmem.obj) : 오류 LNK2005:
"void * __cdecl operator new(unsigned int)"(??2@YAPAXI@Z)이(가)
LIBCMTD.lib(new.obj)에 이미 정의되어 있습니다.
nafxcwd.lib(afxmem.obj) : 오류 LNK2005:
"void __cdecl operator delete(void *)"(??3@YAXPAX@Z)이(가)
LIBCMTD.lib(dbgnew.obj)에 이미 정의되어 있습니다.
nafxcwd.lib(afxmem.obj) : 오류 LNK2005:
"void * __cdecl operator new(unsigned int,int,char const *,int)"
(??2@YAPAXIHPBDH@Z)이(가) LIBCMTD.lib(dbgnew.obj)에 이미 정의되어 있습니다.
mfcs40d.lib(dllmodul.obj): 오류 LNK2005: _DllMain@12이(가)
MSVCRTD.LIB (dllmain.obj)에 이미 정의되어 있습니다.
mfcs42d.lib(dllmodul.obj): 오류 LNK2005: _DllMain@12이(가)
msvcrtd.lib(dllmain.obj)에 이미 정의되어 있습니다.

원인

CRT 라이브러리는 new, deleteDllMain 함수에 대해 약한 외부 링크를 사용합니다. MFC 라이브러리에도 new, deleteDllMain 함수가 포함되어 있어 CRT 라이브러리 전에 MFC를 링크해야 합니다.

해결 방법
이 문제를 해결할 수 있는 방법에는 두 가지가 있습니다. 첫 번째 해결 방법은 링커가 올바른 순서로 라이브러리를 강제 링크하도록 하는 것입니다. 두 번째 해결 방법은 문제를 일으키는 모듈을 찾아 해결하는 것입니다.

해결 방법 1: 링커가 올바른 순서로 라이브러리를 강제 링크하는 방법

1. Project 메뉴에서 Settings을 눌러 Project Settings 대화 상자를 엽니다.
2. Settings For 뷰에서 링크 오류가 발생하는 프로젝트 구성을 선택(강조 표시)합니다.
3. Link 탭을 누릅니다.
4. Category 콤보 상자에서 INPUT을 선택합니다.
5. Ignore Libraries 입력란에 라이브러리 이름(예: Nafxcwd.lib Libcmtd.lib)을 입력합니다.

참고: 링커 명령줄은 /NOD:<library name>과 동일합니다.
6. Object/library Modules 입력란에 라이브러리 이름을 입력합니다. 이 이름은 반드시 해당 행의 처음 두 라이브러리(예: Nafxcwd.lib Libcmtd.lib)와 같은 순서대로 나열되어야 합니다.
Visual C++ .NET에서 이 옵션을 설정하려면 온라인 도움말의 Visual C++ 프로젝트 속성 설정 항목을 참조하십시오.

해결 방법 2: 문제 모듈을 찾아 해결하는 방법

다음 단계를 수행하여 현재 라이브러리 링크 순서를 확인합니다.
1. Project 메뉴에서 Settings을 눌러 Project Settings 대화 상자를 엽니다.
2. Settings For 뷰에서 링크 오류가 발생하는 프로젝트 구성을 선택(강조 표시)합니다.
3. Link 탭을 누릅니다.
4. Project Options 대화 상자에 다음을 입력합니다.
/verbose:lib
5. 프로젝트를 다시 빌드합니다. 링크하는 과정에서 출력 창에 라이브러리가 표시됩니다.
 

현재 상태

이것은 의도적으로 설계된 동작입니다.
 

추가 정보

MFC 라이브러리를 사용할 때는 MFC 라이브러리가 CRT 라이브러리 전에 링크되도록 해야 합니다. 이렇게 하려면 프로젝트에 있는 모든 파일이 직접(#include <Afx.h>) 또는 간접(#include <Stdafx.h>)적으로 먼저 Msdev\Mfc\Include\Afx.h를 포함하도록 합니다. Afx.h 포함 파일은 #pragma 주석(lib,"<libname>") 지시어를 사용하여 라이브러리의 순서를 올바르게 조정합니다.

원본 파일 확장명이 .c이거나 파일 확장명이 .cpp이지만 MFC를 사용하지 않는 경우 모듈 맨 위에 작은 헤더 파일(Forcelib.h)을 만들어 포함시킬 수 있습니다. 이 새로운 헤더가 라이브러리 검색 순서를 올바르게 합니다.

Visual C++에는 이 헤더 파일이 들어 있지 않지만 다음 단계를 수행하여 이 파일을 쉽게 만들 수 있습니다.
1. Msdev\Mfc\Include\Afx.h를 엽니다.
2. #ifndef _AFX_NOFORCE_LIBS와 #endif //!_AFX_NOFORCE_LIBS 사이의 행을 선택합니다.
3. 선택 영역을 Windows 클립보드로 복사합니다.
4. 새 텍스트 파일을 만듭니다.
5. 클립보드 내용을 새 파일에 붙여넣습니다.
6. 파일을 Msdev\Mfc\Include\Forcelib.h로 저장합니다.




Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹에 참여하시기 바랍니다.
 

본 문서의 정보는 다음의 제품에 적용됩니다.
Microsoft Visual C++ 4.0 Standard Edition
Microsoft Visual C++ 4.1 Subscription
Microsoft Visual C++ 5.0 Enterprise Edition
Microsoft Visual C++ 6.0 Enterprise Edition
Microsoft Visual C++ 5.0 Professional Edition
Microsoft Visual C++ 6.0 Professional Edition
Microsoft Visual C++ 6.0 Standard Edition
Microsoft Visual C++ .NET 2002 Standard Edition
 
키워드: 
kberrmsg kbprb kbarttypeinf KB148652

댓글

Designed by JB FACTORY