8

Visual C++ 2005 と MFC を使用して記述された C++ プログラムを MS VS 2010 でコンパイルしようとしています。悲しいことに、コンパイル中に次のエラーが発生します。

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(明らかに使用しているライブラリ)でも定義されているようです。このエラーには 2 つの可能性が考えられます。

  1. 使用しようとしているライブラリの cpp を含めています。通常、プリコンパイル済みライブラリを使用する場合は、独自のソース ファイル内のヘッダー ファイルとリンク時にライブラリを参照するだけで済みます。ライブラリのソース .cpp ファイルを自分のプロジェクトに含めた可能性はありますか? この場合は、プロジェクトからソース .cpp ファイルを削除するだけです。
  2. ライブラリで参照しているクラスと同じ名前の独自のクラスを定義していて、名前が衝突しています。この問題を解決するための推奨される方法は、自分で定義したクラスを名前空間にカプセル化することです。

.

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

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

実際のコードがなければ、推測することしかできません。ほとんどの場合、次のいずれかを行っています。

  • 2回実装CMemDC::~CMemDC() {}しました。名前を変更しなかったコピーアンドペーストかもしれませんCMemDCImpl::~CMemDCImpl()
  • クラス定義ではなく、クラス定義CMemDC::~CMemDC()ヘッダー ファイルに実装CMemDC
于 2011-02-20T18:09:42.557 に答える
3

私が使用する解決策:よく知られており、よく使用されている CMemDC クラスの名前を CMemDc として変更します

マイクロソフトがそれを粉砕し、キースまたは私たち自身がそれを著作権で保護していないからです?!?

vs2k10 で、Microsoft は、Keith の CMemDC クラスの名前をあえてつぶしました。

昨日生まれた Microsoft の皆さん: これは 1997 年以来、誰もが使用している最も人気のあるクラスの 1 つです! きもい!残念だな、マイクロソフト!

CMemDc - メモリ DC

// 作者: キース・ルール

// メール: keithr@europa.com

// Copyright 1996-1997、キース・ルール

ありがとうキース!「アフターゲイツ」の「新しい」「壊滅的な」連中は、私たちが持っているすべてのソースのすべての「CMemDC」を変更することを望んでいます。

于 2012-04-01T05:05:20.357 に答える