2011-02-20 3 views
7

나는 슬프게도 내가 컴파일시 다음과 같은 오류를 받고 있어요 MS VS 2010에서 Visual C++ 2005 MFC를 사용하여 작성하는 C++ 프로그램을 컴파일하기 위해 노력하고있어 :LNK 2005 2010

Error 2 error LNK2005: "public: virtual __thiscall CMemDC::~CMemDC(void)" ([email protected]@[email protected]) already defined in CMemDCImpl.obj Project\Project\Project\uafxcwd.lib(afxglobals.obj) Project. 

CMemDCImpl에는 CMemDCImpl 클래스의 모든 멤버에 대한 정의와 구현 된 * .cpp 파일이 포함 된 헤더 파일이 있습니다. 이 오류를 해결하도록 도와주세요.

+2

코드도 표시하십시오. – Erik

+0

코드? 무엇 때문에? –

답변

6

당신은 CMemDCImpl가 cpp 파일에 정의되어 있다고 언급합니다. 그러나, 그것은 또한 uafxcwd.lib (분명히 사용하는 라이브러리)에서 정의 된 것 같습니다. 이 오류에 대한 두 가지 가능성을 생각할 수 있습니다

  1. 당신이 사용을 시도하고있는 라이브러리의 CPP를 포함하고 있습니다. 일반적으로 미리 컴파일 된 라이브러리를 사용하는 경우에는 링크 할 때 자신의 소스 파일과 라이브러리의 헤더 파일 만 참조하면됩니다. 자신의 프로젝트에 라이브러리의 소스 .cpp 파일을 포함시킨 가능성이 있습니까? 이 경우 프로젝트에서 원본 .cpp 파일을 제거하기 만하면됩니다.
  2. 라이브러리에서 참조하고있는 이름과 같은 이름을 가진 클래스를 정의하면 이름 충돌이 발생합니다. 이 문제를 해결하는 가장 좋은 방법은 자신이 정의한 클래스를 네임 스페이스에 캡슐화하는 것입니다.

namespace Foo 
{ 
    class CMemDC 
    { 
     // ... 
    }; 
} 

// Usage: 
Foo::CMemDC myMemDC; 
3

실제 코드가 없으면 추측 할 수 있습니다. 당신이 이들 중 하나했을 가능성이 높습니다 :

  • 어쩌면 복사 - 붙여 넣기하면에서 CMemDC 클래스 정의 대신 후 헤더 파일에 CMemDC::~CMemDC()을 구현 CMemDCImpl::~CMemDCImpl()
  • 로 이름을 변경하지 않았다 두 번 CMemDC::~CMemDC() {}를 구현 클래스 정의
1

솔루션 I 사용 : Microsoft는 IT와 키스 나 자신이 저작권을하지 않은 분쇄 때문에 CMemDc

으로 뭔가 잘 알려진 잘 사용 CMemDC 클래스의 이름을 변경?!?

(vs2k10) Microsoft는 Keith의 CMemDC 클래스 이름을 감히 썼습니다.

어제 태어난 Microsoft 사람들 : 이것은 1997 년 이래로 모두가 사용하는 가장 인기있는 클래스 중 하나입니다! 총체! 부끄러운 줄 알아, 마이크로 소프트!

CMemDc - 메모리 DC

// 저자 : 키이스 규칙

// 이메일 : [email protected]

// 저작권 1,996에서 1,997 사이, 키스 규칙

감사 너 키이스! "게이츠 이후"의 "새롭고"대재앙적인 사람들은 우리가 가진 모든 소스에서 모든 "CMemDC"를 바꾸기를 원합니다. 얼마나 수치스러운 일입니까 ... 수치스러운 일

+0

Keith의 CMemDc 클래스는 The Code Project에서 가져 왔으며, MFC가 같은 이름의 클래스를 추가하기 전에 만들어진 것으로 가정합니다. 여기에 언급했듯이 코드 프로젝트 페이지에 대한 의견에서 Keith의'MemDc.h'의 이름을'CustomMemDc.h'와 같은 것으로 변경하고 클래스와 클래스에 대한 모든 참조를 'CCustomMemDc' . –