2011-02-20 11 views
7

Sto cercando di compilare un programma C++, scritto utilizzando Visual C++ 2005 e MFC, in MS VS 2010. Purtroppo sto ottenendo il seguente errore durante la compilazione:LNK 2005 in Visual C++ in Visual Studio 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 ha un file di intestazione che contiene le definizioni di tutti i membri della classe CMemDCImpl e del file * .cpp con le relative implementazioni. Per favore aiutami a correggere questo errore.

+2

Mostraci anche il codice.Codice – Erik

+0

? per cosa? –

risposta

6

Si dice che CMemDCImpl è definito in un file cpp. Tuttavia, sembra anche essere definito in uafxcwd.lib (una libreria che apparentemente usi). Mi vengono in mente due possibilità per questo errore:

  1. Stai compresa la cpp della biblioteca si sta tentando di utilizzare. Di solito, quando si utilizza una libreria precompilata, è sufficiente fare riferimento al file di intestazione nel proprio file sorgente e nella libreria al momento del collegamento. È possibile che tu abbia incluso i file .cpp di origine della libreria nel tuo progetto? In questo caso, rimuovi semplicemente i file .cpp di origine dal tuo progetto.
  2. Stai definendo una classe che ha lo stesso nome di quello a cui fai riferimento nella libreria e hai un conflitto di nomi. Il metodo preferito per risolvere questo problema è incapsulare la classe definita dall'utente in uno spazio dei nomi:

.

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

// Usage: 
Foo::CMemDC myMemDC; 
3

Senza il codice effettivo, possiamo solo indovinare. Molto probabilmente avete fatto uno di questi:

  • Implementato CMemDC::~CMemDC() {} due volte, forse una copia-incolla che non rinominare a CMemDCImpl::~CMemDCImpl()
  • Implementato CMemDC::~CMemDC() in un file di intestazione dopo definizione CMemDC classe invece di in la definizione della classe
1

Soluzione usare: rinominare il ben noto e ben utilizzati classe CMemDC in qualcosa come CMemDc

perché Microsoft schiacciò e Keith o noi stessi non sono protetti da copyright è?!?

in vs2k10 Microsoft ha osato schiacciare il nome della classe CMemDC di Keith, con un po 'di merda.

Ieri nato Microsoft ragazzi: questo è uno dei corsi più popolari che tutti usano dal 1997! Lordo! Vergogna, Microsoft!

CMemDc - memoria DC

// Autore: Keith Rule

// E-mail: [email protected]

// Copyright 1996-1997, Keith Rule

Grazie Tu Keith! Quelli "nuovi" e "catastrofici" di "the after-Gates" vogliono che cambiamo ogni "CMemDC" in ogni fonte che abbiamo .. Che vergogna

+0

La classe CMemDc di Keith proviene da The Code Project e presumo che sia stata creata prima che MFC aggiungesse una classe con lo stesso nome. Come è stato affermato qui, e in un commento sulla pagina del Progetto del codice, la soluzione è di rinominare il 'MemDc.h' di Keith in qualcosa come' CustomMemDc.h', e rinominare la classe e tutti i riferimenti ad esso in qualcosa come 'CCustomMemDc' . –