Pergunta

Estou tentando compilar um programa C++, escrito usando Visual C++ 2005 e MFC, no MS VS 2010.Infelizmente estou recebendo o seguinte erro durante a compilação:

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 possui um arquivo de cabeçalho que contém definições de todos os membros da classe CMemDCImpl, e um arquivo *.cpp com suas implementações.Por favor me ajude a corrigir esse erro.

Foi útil?

Solução

Você mencionou que seu CMemDCImpl está definido em um arquivo cpp.No entanto, também parece estar definido em uafxcwd.lib (uma biblioteca que você aparentemente usa).Posso pensar em duas possibilidades para esse erro:

  1. Você está incluindo o cpp da biblioteca que está tentando usar.Normalmente, quando você usa uma biblioteca pré-compilada, você só precisa fazer referência ao arquivo de cabeçalho em seu próprio arquivo de origem e à biblioteca no momento do link.É possível que você tenha incluído os arquivos .cpp de origem da biblioteca em seu próprio projeto?Se for esse o caso, simplesmente remova os arquivos .cpp de origem do seu projeto.
  2. Você está definindo uma classe própria que tem o mesmo nome daquela que você está referenciando na biblioteca e tem um conflito de nomes.O método preferido para corrigir esse problema é encapsular a classe que você mesmo definiu em um namespace:

.

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

// Usage:
Foo::CMemDC myMemDC;

Outras dicas

Sem o código real, só podemos adivinhar.Provavelmente você já fez um destes:

  • Implementado CMemDC::~CMemDC() {} duas vezes, talvez um copiar e colar que você não renomeou CMemDCImpl::~CMemDCImpl()
  • Implementado CMemDC::~CMemDC() em um arquivo de cabeçalho depois CMemDC definição de classe em vez de em a definição de classe

Solução que eu uso:renomeie a classe CMemDC bem conhecida e usada em algo como CMemDc

porque a Microsoft o esmagou e Keith ou nós mesmos não os protegemos ?!?

no vs2k10 a Microsoft se atreveu a esmagar o nome da turma CMemDC do Keith, com alguma merda.

Ontem nasceram caras da Microsoft:esta é uma das classes mais populares que todo mundo usa desde 1997! Bruto!Que vergonha, Microsoft!

CMemDc - memória DC

//Autor:Regra de Keith

// E-mail:keithr@europa.com

// Copyright 1996-1997, Regra de Keith

Obrigado Keith!Esses caras “novos” e “catastróficos” do “pós-Gates” querem que mudemos todos os “CMemDC” em todas as fontes que temos.Que pena

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top