LNK 2005 em Visual C++ no Visual Studio 2010
-
15-11-2019 - |
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.
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:
- 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.
- 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 renomeouCMemDCImpl::~CMemDCImpl()
- Implementado
CMemDC::~CMemDC()
em um arquivo de cabeçalho depoisCMemDC
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