2011-02-20 46 views
7

我尝试编译C++程序,编写使用Visual C++ 2005和MFC,在MS VS 2010可悲的是,我在编译过程中发现了以下错误:LNK 2005年在Visual Studio中的Visual C++ 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() {}两次,可能是复制粘贴,你没有重命名为CMemDCImpl::~CMemDCImpl()
  • CMemDC类定义,而不是在头文件实现CMemDC::~CMemDC()类定义
1

解决方法我用:在一些重命名众所周知的,很好用的CMemDC类类作为CMemDC类

因为微软粉碎它和Keith或自己也没有版权了吗?!?

vs2k10微软敢于用一些垃圾压碎Keith的CMemDC类的名字。

昨天出生的微软家伙:这是自1997年以来每个人都使用的最受欢迎的课程之一! 毛!耻辱你,微软!

CMemDC类 - 内存DC

//作者:基思规则

//电子邮件:[email protected]

//版权所有1996- 1997年,基思规则

谢谢你基思!那些“后盖茨”的“新”和“灾难性”家伙希望我们改变每一个“CMemDC”在我们拥有的每一个来源。真是太遗憾了!

+0

Keith的CMemDc类来自The Code Project,我假设在MFC添加一个同名的类之前创建了这个类。正如此处所述,并且在Code Project页面的评论中,解决方案是将Keith的'MemDc.h'重命名为类似于'CustomMemDc.h'的类,并将该类及其所有引用重命名为'CCustomMemDc' 。 –