Estranho MFC / VC ++ Linker Error (std :: list já definido)
-
02-07-2019 - |
Pergunta
Eu tenho uma mensagem de erro realmente estranho que só ocorre quando eu adicione a seguinte linha ao meu projeto:
std::list<CRect> myVar;
É importante notar que ele não tem que ser um std :: lista, pode ser std :: vector ou qualquer outro recipiente STL eu assumo.
Aqui está a mensagem de erro:
Erro 1 erro LNK2005: "público: __thiscall std :: list
:: lista> (void)" (?? 0? $ List @ VCRect @@ V? $ Alocador @ VCRect @@@ std @@@ std @@ QAE @ XZ) já definido em SomeLowLevelLibrary.lib
A biblioteca de baixo nível que está referenciado na mensagem de erro não tem nenhuma idéia sobre o projeto que estou construindo, ele só tem funcionalidade do núcleo de baixo nível e não lida com alto nível GUIs MFC.
posso obter o erro de vinculador para ir embora se eu mudar a linha de código para:
std::list<CRect*> myVar;
Mas eu não quero cortá-lo para o bem dela.
Além disso, não importa se eu criar a variável na pilha ou a pilha, eu ainda obter o mesmo erro.
Alguém tem alguma idéia qualquer sobre isso? Estou usando o Microsoft Visual Studio 2008 SP1 no Vista Enterprise.
Editar:. O erro vinculador acima é para o std :: list <> construtor, eu também obter um erro para o destruidor, _Nextnode e funções claras
Editar: Em outros arquivos do projeto, std :: vector não link, em outros arquivos que poderia ser std :: lista. Eu não posso trabalhar fora porque alguns recipientes de trabalhar, e outros não. ligação MFC é estática em ambos bibliotecas. Na biblioteca de baixo nível, temos uma classe que herda de std :: lista.
Editar:. A biblioteca de baixo nível não tem nenhum classes que herdam CRect, mas faz uso da STL
Solução 2
Recentemente, deparei com este erro de novo no nosso projecto e decidiu ter uma investigação mais aprofundada em comparação com apenas remendar-lo com um hack como da última vez (swap std :: lista para CArray). Acontece que uma das nossas bibliotecas de baixo nível foi herdando std :: lista, por exemplo.
class LIB_EXPORT CRectList : public std::list<CRect>
{
};
Este não é apenas uma prática ruim, mas foi também a causa dos erros de vinculador no aplicativo principal. Eu mudar CRectList para embrulhar std :: lista em vez de herdar a partir dele e o erro foi embora.
Outras dicas
Você deve estar olhando para as definições vinculador, mas não posso imediatamente dizer qual. É normal para instantiations STL de ser feito em vários arquivos. O vinculador deve escolher um. Eles são todos idênticos (supondo que você do têm configurações do compilador consistentes).
Isso não soa como o sintoma exato, mas para ter certeza de que você deve verificar se o seu projeto principal e todas as suas bibliotecas incluídas usar o mesmo "Runtime Library" configuração em "C ++: Geração de código". Misturar essas configurações podem criar tempo de execução erros de link da biblioteca. (O que me confunde, no seu caso é que você pode fazer isso ir embora alterando o código, mas vale a pena verificar se você já não o fez.)
O SomeLowLevelLibrary.lib conter ou usar quaisquer classes nomeadas CRect? Ele usa STL?
O arquivo incluído em um cabeçalho que pode ser compilado em dois módulos de código separados?
Outra possibilidade aleatória surgiu na minha cabeça hoje. É possível que sua DLL atual e baixo biblioteca nível estão fazendo referência duas versões diferentes do MFC? Tiro longo.