Visual C 中的 LNK 2005在 Visual Studio 2010 中

发布于 2024-10-18 13:21:39 字数 377 浏览 5 评论 0原文

我正在尝试在 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 文件及其实现。请帮我修复这个错误。

I'm trying to compile a C++ program, written using Visual C++ 2005 and MFC, in MS VS 2010. Sadly I'm getting the following error during compilation:

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 has a header file which contains definitions of all members of the class CMemDCImpl, and *.cpp file with their implementations. Please help me to fix this error.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

风筝有风,海豚有海 2024-10-25 13:21:39

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

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

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

// Usage:
Foo::CMemDC myMemDC;

You mention that you CMemDCImpl is defined in a cpp file. However, it also seems to be defined in uafxcwd.lib (a library you apparently use).
I can think of two possibilities for this error:

  1. You're including the cpp of the library you're attempting to use. Usually, when you use a precompiled library, you only need to reference the header file in your own source file and the library at link time. Is it possible that you included the source .cpp files of the library in your own project? If this is the case, simply remove the source .cpp files from your project.
  2. You're defining a class of your own that has the same name as the one you're referencing in the library and you have a name clash. The preferred method to fix this issue is to encapsulate the class you defined yourself in a namespace:

.

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

// Usage:
Foo::CMemDC myMemDC;
那支青花 2024-10-25 13:21:39

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

  • 实现了 CMemDC::~CMemDC() {} 两次,可能是复制粘贴但未重命名为 CMemDCImpl::~CMemDCImpl()
  • CMemDC 类定义之后的头文件中实现 CMemDC::~CMemDC(),而不是类定义中

Without the actual code, we can only guess. Most likely you have done one of these:

  • Implemented CMemDC::~CMemDC() {} twice, maybe a copy-paste that you didn't rename to CMemDCImpl::~CMemDCImpl()
  • Implemented CMemDC::~CMemDC() in a header file after CMemDC class definition instead of in the class definition
爱殇璃 2024-10-25 13:21:39

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

因为 Microsoft 粉碎了它,而 Keith 或我们自己没有对其拥有版权?!?

在vs2k10中微软竟然敢用一些狗屎来碾压Keith的CMemDC类的名字。

昨天出生的 Microsoft 家伙:这是自 1997 年以来每个人都使用的最受欢迎的课程之一! 恶心!微软,你真丢脸!

CMemDc - 内存 DC

// 作者:Keith Rule

// 电子邮件:[电子邮件受保护]

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

谢谢 Keith!那些“后门”的“新”和“灾难性”家伙希望我们改变我们拥有的每个来源中的每个“CMemDC”..真是可惜

Solution I use : rename the well known and well used CMemDC class in something as CMemDc

because Microsoft crushed it and Keith or ourselves have not copyrighted it ?!?

in vs2k10 Microsoft dared to crush the name of the CMemDC class of Keith, with some shit.

Yesterday born Microsoft guys : this it's one of the most popular classes that everyone uses since 1997! Gross! Shame on you, Microsoft !

CMemDc - memory DC

// Author: Keith Rule

// Email: [email protected]

// Copyright 1996-1997, Keith Rule

Thank You Keith ! Those "new" and "catastrophic" guys of "the after-Gates" want us to change every "CMemDC" in every sources we have.. What a shame

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文