2011-02-20 6 views
7

私は、悲しいことに、私はコンパイル時に次のエラーを取得していますMS VS 2010年には、Visual C++ 2005とMFCを使って書かれ、C++プログラムをコンパイルしようとしている:LNK 2005 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

、我々は唯一の推測することができます。ほとんどの場合、あなたがこれらのいずれかを行っている:

  • は、多分あなたはCMemDCImpl::~CMemDCImpl()
  • に名前を変更していないコピー&ペーストがCMemDCクラス定義の代わりに、で後、ヘッダーファイル内CMemDC::~CMemDC()を実装、二回CMemDC::~CMemDC() {}を実装クラス定義
1

溶液Iを使用します。マイクロソフトはそれとキースや自分自身がそれを著作権で保護されていない砕いたのでCMemDc

ような何かでよく知られ、よく使わCMemDCクラスの名前を変更?!? vs2k10マイクロソフトで

は、いくつかのたわごとで、キースのCMemDCクラスの名前を鎮圧する勇気。

昨日の誕生したマイクロソフトの男の子:これは1997年以来誰もが使っている最も人気のあるクラスの1つです! 総計!あなたに恥をかく、Microsoft!

CMemDc - メモリDC

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

// Eメール:[email protected]

//著作権1996年から1997年、キース・ルール

感謝あなたキース!これらの「新」と「後・ゲイツ」私たちは、私たちが持っているすべてのソース内のすべての「CMemDC」を変更したいの「致命的な」男..何恥

+0

キースのCMemDcクラスはコードプロジェクトから来ており、MFCがクラスを同じ名前で追加する前に作成されたものと想定しています。ここで述べたように、コードプロジェクトページのコメントでは、Keithの 'MemDc.h'の名前を' CustomMemDc.h'のように変更し、クラスとそのすべての参照を 'CCustomMemDc' 。 –