Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
símbolo já definido no objeto
Observações
O símbolo foi definido mais de uma vez.
Este erro é seguido por erro fatal LNK1169.
Causas e soluções possíveis
Geralmente, esse erro significa que você quebrou a regra de uma definição, que permite apenas uma definição para qualquer modelo, função, tipo ou objeto usado em um determinado arquivo de objeto, e apenas uma definição em todo o executável para objetos ou funções visíveis externamente.
Aqui estão algumas causas comuns para esse erro.
Este erro pode ocorrer quando um arquivo de cabeçalho define uma variável. Por exemplo, se você incluir esse arquivo de cabeçalho em mais de um arquivo de origem em seu projeto, um erro resultará:
// LNK2005_global.h int global_int; // LNK2005As soluções possíveis incluem:
Declare a variável
externno arquivo de cabeçalho:extern int global_int;, defina-a e, opcionalmente, inicialize-a em um e apenas um arquivo de origem:int global_int = 17;. Essa variável agora é um global que você pode usar em qualquer arquivo de origem, declarando-oextern, por exemplo, incluindo o arquivo de cabeçalho. Recomendamos esta solução para variáveis que devem ser globais, mas uma boa prática de engenharia de software minimiza as variáveis globais.Declare a variável estática:
static int static_int = 17;. Isso restringe o escopo da definição ao arquivo de objeto atual e permite que vários arquivos de objeto tenham sua própria cópia da variável. Não recomendamos que você defina variáveis estáticas em arquivos de cabeçalho devido ao potencial de confusão com variáveis globais. Prefira mover definições de variáveis estáticas para os arquivos de origem que as usam.Declare a variável selectany:
__declspec(selectany) int global_int = 17;. Isso instrui o vinculador a escolher uma definição para todas as referências externas e descartar as restantes. Essa solução às vezes é útil ao combinar bibliotecas de importação. Caso contrário, não recomendamos como uma forma de evitar erros de vinculação.
Este erro pode ocorrer quando um ficheiro de cabeçalho define uma função que não é
inline. Se você incluir esse arquivo de cabeçalho em mais de um arquivo de origem, obterá várias definições da função no executável.// LNK2005_func.h int sample_function(int k) { return 42 * (k % 167); } // LNK2005As soluções possíveis incluem:
Adicione a
inlinepalavra-chave à função:// LNK2005_func_inline.h inline int sample_function(int k) { return 42 * (k % 167); }Remova o corpo da função do arquivo de cabeçalho e deixe apenas a declaração, em seguida, implemente a função em um e apenas um arquivo de origem:
// LNK2005_func_decl.h int sample_function(int);// LNK2005_func_impl.cpp int sample_function(int k) { return 42 * (k % 167); }
Este erro também pode ocorrer se você definir funções de membro fora da declaração de classe em um arquivo de cabeçalho:
// LNK2005_member_outside.h class Sample { public: int sample_function(int); }; int Sample::sample_function(int k) { return 42 * (k % 167); } // LNK2005Para corrigir esse problema, mova as definições de função de membro dentro da classe. As funções de membro definidas dentro de uma declaração de classe são implicitamente embutidas.
// LNK2005_member_inline.h class Sample { public: int sample_function(int k) { return 42 * (k % 167); } };Este erro pode ocorrer se você vincular mais de uma versão da biblioteca padrão ou CRT. Por exemplo, se tentares ligar as bibliotecas CRT de distribuição e depuração, ou ambas as versões estática e dinâmica de uma biblioteca, ou duas versões diferentes de uma biblioteca padrão ao teu executável, este erro pode ser reportado muitas vezes. Para corrigir este problema, remova todas, exceto uma cópia de cada biblioteca do comando de ligação. Não recomendamos que você misture bibliotecas de varejo e de depuração, ou versões diferentes de uma biblioteca, no mesmo executável.
Para dizer ao vinculador para usar bibliotecas diferentes dos padrões, na linha de comando, especifique as bibliotecas a serem usadas e use a opção /NODEFAULTLIB para desabilitar as bibliotecas padrão. No IDE, adicione referências ao seu projeto para especificar as bibliotecas a serem usadas e, em seguida, abra a caixa de diálogo Páginas de propriedades do seu projeto e, na página de propriedades Vinculador, Entrada , defina as propriedades Ignorar todas as bibliotecas padrão ou Ignorar bibliotecas padrão específicas para desabilitar as bibliotecas padrão.
Este erro pode ocorrer se você misturar o uso de bibliotecas estáticas e dinâmicas ao usar a opção /clr . Por exemplo, este erro pode ocorrer se criar uma DLL para uso no seu executável que se liga ao CRT estático. Para corrigir esse problema, use apenas bibliotecas estáticas ou apenas bibliotecas dinâmicas para todo o executável e para quaisquer bibliotecas que você criar para usar no executável.
Este erro pode ocorrer se o símbolo for uma função empacotada (criada pela compilação com /Gy) e foi incluída em mais de um arquivo, mas foi alterada entre compilações. Para corrigir esse problema, recompile todos os arquivos que incluem a função empacotada.
Este erro pode ocorrer se o símbolo é definido de forma diferente em dois objetos de membro em bibliotecas diferentes, e ambos os objetos de membro são usados. Uma maneira de corrigir esse problema quando as bibliotecas estão vinculadas estaticamente é usar o objeto membro de apenas uma biblioteca e incluir essa biblioteca primeiro na linha de comando do vinculador. Para usar ambos os símbolos, você deve criar uma maneira de distingui-los. Por exemplo, se você puder criar as bibliotecas a partir do código-fonte, poderá encapsular cada biblioteca em um namespace exclusivo. Como alternativa, você pode criar uma nova biblioteca de wrapper que usa nomes exclusivos para encapsular referências a uma das bibliotecas originais, vincular a nova biblioteca à biblioteca original e, em seguida, vincular o executável à nova biblioteca em vez da biblioteca original.
Este erro pode ocorrer se uma
extern constvariável for definida duas vezes e tiver um valor diferente em cada definição. Para corrigir esse problema, defina a constante apenas uma vez ou use namespaces ouenum classdefinições para distinguir as constantes.Este erro pode ocorrer se você usar uuid.lib em combinação com outros arquivos .lib que definem GUIDs (por exemplo, oledb.lib e adsiid.lib). Por exemplo:
oledb.lib(oledb_i.obj) : error LNK2005: _IID_ITransactionObject already defined in uuid.lib(go7.obj)Para corrigir esse problema, adicione /FORCE:MULTIPLE às opções de linha de comando do vinculador e verifique se uuid.lib é a primeira biblioteca referenciada.