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

Foi útil?

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.

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