Visual Studio 2010中Visual C++出现LNK 2005错误

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文件,其中包含它们的实现。请帮我修复这个错误。

3个回答

7
您提到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(),而不是在类定义中实现

3

我使用的解决方案:将广为人知和使用的CMemDC类命名为CMemDc

因为Microsoft压制了它,而Keith或我们自己没有版权?!?

在vs2k10中,Microsoft敢于用一些垃圾来压制Keith的CMemDC类的名称。

昨天出生的Microsoft人员:这是自1997年以来每个人都在使用的最受欢迎的类之一!太过分了!你们应该感到羞耻,Microsoft!

CMemDc - 内存DC

// 作者:Keith Rule

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

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

谢谢你,Keith!那些“新的”和“灾难性”的“盖茨后”人想让我们更改我们拥有的每个源中的每个“CMemDC”。多么可耻。


Keith的CMemDc类来自The Code Project,我认为它是在MFC添加了一个同名类之前创建的。正如在这里和Code Project页面上的评论中所述,解决方案是将Keith的MemDc.h重命名为类似CustomMemDc.h的东西,并将类及其所有引用重命名为类似CCustomMemDc的东西。 - Gordon Brandly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接