2011-02-20 41 views
7

Estoy intentando compilar un programa en C++, escrito con Visual C++ 2005 y MFC, en MS VS 2010. Lamentablemente estoy recibiendo el siguiente error durante la compilación:LNK 2005 en Visual C++ en 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 tiene un archivo de cabecera que contiene las definiciones de todos los miembros de la clase CMemDCImpl, y * archivo .cpp con sus implementaciones. Por favor, ayúdame a corregir este error.

+2

Demuéstranos el código también. – Erik

+0

code? ¿para qué? –

Respuesta

6

Menciona que CMemDCImpl se define en un archivo cpp. Sin embargo, también parece estar definido en uafxcwd.lib (una biblioteca que aparentemente usa). puedo pensar en dos posibilidades para este error:

  1. Estás incluyendo el CPP de la biblioteca que está intentando utilizar. Por lo general, cuando utiliza una biblioteca precompilada, solo necesita hacer referencia al archivo de encabezado en su propio archivo fuente y la biblioteca en el momento del enlace. ¿Es posible que haya incluido los archivos fuente .cpp de la biblioteca en su propio proyecto? Si este es el caso, simplemente elimine los archivos fuente .cpp de su proyecto.
  2. estás definiendo una clase de su propio que tiene el mismo nombre que el que se está haciendo referencia en la biblioteca y tiene un nombre choque. El método preferido para solucionar este problema es encapsular la clase que definió usted mismo en un espacio de nombres:

.

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

// Usage: 
Foo::CMemDC myMemDC; 
3

Sin el código real, solo podemos adivinar. Lo más probable es que haya hecho una de estas:

  • Implementado CMemDC::~CMemDC() {} dos veces, tal vez un copiar y pegar que no cambió el nombre a CMemDCImpl::~CMemDCImpl()
  • CMemDC::~CMemDC() Implementado en un fichero de cabecera después de la definición CMemDC clase en lugar de en la definición de clase
1

solución I utilizar: cambiar el nombre de la clase CMemDC bien conocido y bien utilizado en algo tan CMemDc

porque Microsoft lo aplastó y Keith o de nosotros mismos no haber derechos de autor que?!?

en vs2k10 Microsoft se atrevió a aplastar el nombre de la clase CMemDC de Keith, con algo de mierda.

Ayer nació Microsoft guys: ¡esta es una de las clases más populares que todos usan desde 1997! Bruto! ¡Qué vergüenza, Microsoft!

CMemDc - DC de memoria

// Autor: Keith Rule

// Email: [email protected]

// Derechos de Autor 1996-1997, Keith Rule

Gracias ¡Keith! Esos tipos "nuevos" y "catastróficos" de "The After-Gates" quieren que cambiemos cada "CMemDC" en todas las fuentes que tenemos ... Qué lástima

+0

La clase CMemDc de Keith proviene de The Code Project, y supongo que fue creada antes de que MFC agregara una clase con el mismo nombre. Como se indicó aquí, y en un comentario en la página Code Project, la solución es cambiar el nombre de 'MemDc.h' de Keith a algo así como' CustomMemDc.h', y cambiar el nombre de la clase y todas las referencias a algo como 'CCustomMemDc' . –