8

我正在尝试在 MS VS 2010 中编译使用 Visual C++ 2005 和 MFC 编写的 C++ 程序。遗憾的是,我在编译过程中遇到以下错误:

Error 2 error LNK2005: "public: virtual __thiscall CMemDC::~CMemDC(void)" (??1CMemDC@@UAE@XZ) already defined in CMemDCImpl.obj Project\Project\Project\uafxcwd.lib(afxglobals.obj) Project.

CMemDCImpl 有一个头文件,其中包含 CMemDCImpl 类的所有成员的定义,以及 *.cpp 文件及其实现。请帮我解决这个错误。

4

3 回答 3

7

您提到您 CMemDCImpl 是在 cpp 文件中定义的。但是,它似乎也在 uafxcwd.lib (您显然使用的库)中定义。我可以想到此错误的两种可能性:

  1. 您正在包括您尝试使用的库的 cpp。通常,在使用预编译库时,只需要在自己的源文件和链接时引用库中的头文件即可。您是否可以在自己的项目中包含库的源 .cpp 文件?如果是这种情况,只需从项目中删除源 .cpp 文件。
  2. 您正在定义自己的类,该类与您在库中引用的类同名,并且您有名称冲突。解决此问题的首选方法是将您自己定义的类封装在命名空间中:

.

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

// Usage:
Foo::CMemDC myMemDC;
于 2011-02-20T19:02:01.113 回答
3

没有实际代码,我们只能猜测。您很可能已经完成了以下操作之一:

  • 实施CMemDC::~CMemDC() {}了两次,也许是您没有重命名的复制粘贴CMemDCImpl::~CMemDCImpl()
  • CMemDC::~CMemDC()在类定义后的头文件中实现,CMemDC而不是类定义中实现
于 2011-02-20T18:09:42.557 回答
3

我使用的解决方案:将众所周知且常用的 CMemDC 类重命名为 CMemDc

因为微软粉碎了它,而基思或我们自己没有版权?!?

在vs2k10 微软敢粉碎Keith 的CMemDC 类的名字,有点狗屁。

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

CMemDc - 内存 DC

// 作者:基思规则

// 电子邮件:keithr@europa.com

// 版权所有 1996-1997,Keith Rule

谢谢你,基思!“后盖茨”的那些“新”和“灾难性”家伙希望我们改变我们拥有的每一个来源中的每一个“CMemDC”……真可惜

于 2012-04-01T05:05:20.357 回答