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

기술 자료 번역 기술 자료 번역
기술 자료: 148652 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

현상

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 라이브러리가 링크되어야 합니다.

해결 방법

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

참고 다음 단계는 Visual C++ 6.0을 기반으로 합니다.

해결 방법 1: 올바른 순서로 라이브러리를 링크하도록 링커 설정

  1. Project 메뉴에서 Settings를 클릭합니다.
  2. Project Settings 대화 상자의 Settings For 뷰에서 링크 오류가 발생하는 프로젝트 구성을 선택합니다.
  3. Link 탭의 Category 콤보 상자에서 Input을 선택합니다.
  4. Ignore libraries 상자에 라이브러리 이름(예: Nafxcwd.lib;Libcmtd.lib)을 삽입합니다.

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

해결 방법 2: 문제 모듈 찾기 및 수정

현재 라이브러리 연결 순서를 보려면 다음과 같이 하십시오.
  1. Project 메뉴에서 Settings를 클릭합니다.
  2. Project Settings 대화 상자의 Settings For 뷰에서 링크 오류가 발생하는 프로젝트 구성을 선택합니다.
  3. Link 탭의 Project Options 상자에 /verbose:lib를 입력합니다.
  4. 프로젝트를 다시 빌드합니다. 링크하는 과정에서 출력 창에 라이브러리가 표시됩니다.

현재 상태

이 동작은 의도적으로 설계되었습니다.

추가 정보

MFC 라이브러리를 사용할 때는 CRT 라이브러리가 링크되기 전에 MFC 라이브러리가 링크되도록 해야 합니다. 이렇게 하려면 프로젝트에 있는 모든 파일이 직접(#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로 저장합니다.

Visual C++ .NET에서 문제를 재현하는 방법

  1. Microsoft Visual Studio .NET을 시작합니다.
  2. 파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트를 클릭합니다.
  3. 프로젝트 형식에서 Visual C++ 프로젝트를 클릭한 다음 템플릿에서 MFC 응용 프로그램을 클릭합니다.
  4. 이름 텍스트 상자에 Q148652를 입력합니다.
  5. 위치 텍스트 상자에 C:\Test를 입력한 다음 확인을 클릭합니다.
  6. MFC 응용 프로그램 마법사 대화 상자에서 응용 프로그램 종류를 클릭합니다.
  7. 응용 프로그램 종류 아래에서 대화 상자 기반을 클릭한 다음 MFC 사용 아래에서 정적 라이브러리에서 MFC 사용을 클릭합니다.
  8. 마침을 클릭합니다.
  9. 솔루션 탐색기의 소스 파일에서 세 가지 .cpp 파일을 모두 선택합니다.
  10. 선택한 세 가지 파일을 마우스 오른쪽 단추로 클릭한 다음 제거를 클릭한니다.
  11. 소스 파일을 마우스 오른쪽 단추로 클릭하고 추가를 가리킨 다음 새 항목 추가를 클릭합니다.
  12. 템플릿 아래에서 C++ 파일을 클릭합니다. 이름 텍스트 상자에 Aa를 입력합니다. 열기를 클릭합니다.
  13. Aa.cpp 파일에 다음 코드를 붙여 넣습니다.
    int test(){new int; return 1;}
  14. 소스 파일을 마우스 오른쪽 단추로 클릭하고 추가를 가리킨 다음 기존 항목 추가를 클릭합니다.
  15. 다음 파일을 선택합니다.
    • Q148652.cpp
    • Q148652Dlg.cpp
    • stdafx.cpp
  16. 열기를 클릭합니다.
  17. 15단계에서 선택한 파일이 소스 파일 아래에 나타납니다.
  18. 소스 파일 아래에서 네 가지 .cpp 파일을 모두 선택합니다.
  19. 선택한 네 가지 .cpp 파일을 마우스 오른쪽 단추로 클릭한 다음 속성을 클릭합니다.
  20. 구성 속성을 확장한 다음 C/C++를 확장합니다.
  21. 미리 컴파일된 헤더를 클릭합니다.
  22. 미리 컴파일된 헤더 만들기/사용 속성을 미리 컴파일된 헤더 사용 안 함으로 설정합니다. 확인을 클릭합니다.
  23. 빌드 메뉴에서 솔루션 다시 빌드를 클릭합니다.

속성

기술 자료: 148652 - 마지막 검토: 2010년 3월 25일 목요일 - 수정: 7.1
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Visual C++ 2008 Express Edition
  • 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++, 32-bit Learning Edition 6.0
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
키워드:?
kbsweptvs2008 kbtshoot kbarttypeinf kberrmsg kbprb KB148652

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com