Ocorre um erro de LNK2005 quando a biblioteca de CRT e as bibliotecas MFC estão ligadas na ordem errada no Visual C++

Traduções de Artigos Traduções de Artigos
Artigo: 148652 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Quando a biblioteca de tempo de execução C (CRT) e bibliotecas Microsoft Foundation Classes (MFC) estão ligadas na ordem errada, poderá receber um dos seguintes erros LNK2005:
nafxcwd.lib(afxmem.obj): erro LNK2005:
"void * __cdecl operador novo (int não assinado)"??2@YAPAXI@Z) já
definido em LIBCMTD.lib(new.obj)
nafxcwd.lib(afxmem.obj): erro LNK2005:
"anular __cdecl operador delete(void *)"??3@YAXPAX@Z) já definido
em LIBCMTD.lib(dbgnew.obj)
nafxcwd.lib(afxmem.obj): erro LNK2005:
"void * __cdecl operador new(unsigned int,int,char const *,int)"
(??2@YAPAXIHPBDH@Z) definidos no LIBCMTD.lib(dbgnew.obj)
mfcs40d.lib(dllmodul.obj): erro LNK2005: _DllMain@12 já definido
MSVCRTD.LIB (dllmain.obj)
mfcs42d.lib(dllmodul.obj): erro LNK2005: _DllMain@12 já definido
msvcrtd.lib(DllMain.obj)

Causa

As bibliotecas de CRT utilizam fraca ligação externa para o Novo , Eliminar e funções de DllMain . As bibliotecas MFC também contenham Novo , Eliminar e funções de DllMain . Estas funções requerem as bibliotecas MFC seja ligado antes da biblioteca de CRT está ligada.

Resolução

Existem duas formas para resolver este problema. A primeira solução envolve forçar linker para ligar as bibliotecas na ordem correcta. A solução segunda permite-lhe para localizar o módulo que está a causar o problema e corrigi-la.

Nota Os seguintes passos são baseados no Visual C++ 6.0.

Uma solução: Ligador de forçar para bibliotecas de ligação na ordem correcta

  1. No Project menu, clique em definições .
  2. Na vista De definições da caixa de diálogo Definições do Project , clique para seleccionar a configuração de projecto que estiver a obter os erros de ligação.
  3. No separador ligação , clique para seleccionar entrada na caixa de combinação categoria .
  4. Na caixa Ignorar bibliotecas , insira os nomes de biblioteca (por exemplo, Nafxcwd.lib;Libcmtd.lib).

    Nota O equivalente da linha de comandos linker em /NOD: < nome da biblioteca >.
  5. Na caixa objecto/biblioteca módulos , insira os nomes de biblioteca. Tem de se certificar que estes estão listados por ordem e como as primeiro duas bibliotecas na linha (por exemplo, Nafxcwd.lib Libcmtd.lib).
Para definir esta opção no Visual C++. NET, leia o tópico de ajuda online "Definição Visual C++ propriedades do projecto".

Solução 2: Localizar e corrigir o problema do módulo

Para ver a ordem de ligação biblioteca actual, siga estes passos:
  1. No Project menu, clique em definições .
  2. Na vista De definições da caixa de diálogo Definições do Project , clique para seleccionar a configuração de projecto que estiver a obter os erros de ligação.
  3. No separador ligação , escreva /verbose: lib nas Opções do Project caixa.
  4. Reconstrua o projecto. As bibliotecas serão listadas na janela de resultados durante o processo de ligação.

Ponto Da Situação

Este comportamento ocorre por predefinição.

Mais Informação

Ao utilizar as bibliotecas MFC, certifique-se de que estão ligados antes da biblioteca de CRT está ligada. Pode fazê-lo certificando-se de que todos os ficheiros do projecto inclui Msdev\Mfc\Include\Afx.h primeiro, directamente (# include <Afx.h>) ou indirectamente (# include <Stdafx.h>). O Afx.h incluem ficheiro força pela ordem correcta das bibliotecas, usando a diretiva de comentário (lib, "<libname>") # Pragma.

Se o ficheiro de origem tiver uma extensão .c ou o ficheiro tem uma extensão .cpp mas não utiliza MFC, pode criar e incluir um cabeçalho pequeno ficheiro (Forcelib.h) na parte superior do módulo. Este novo cabeçalho garante que a ordem de procura thelibrary está correcto.

Visual C++ não contém este ficheiro de cabeçalho. Para criar este ficheiro, siga estes passos:
  1. Abra Msdev\Mfc\Include\Afx.h.
  2. Seleccione as linhas entre #ifndef _AFX_NOFORCE_LIBS e #endif / /! _AFX_NOFORCE_LIBS.
  3. Copie a selecção para a área de transferência do Windows.
  4. Crie um novo ficheiro de texto.
  5. Cola o conteúdo da área de transferência para este novo ficheiro.
  6. Guarde o ficheiro como Msdev\Mfc\Include\Forcelib.h.

Passos para reproduzir o problema no Visual C++ .NET

  1. Inicie o Microsoft Visual Studio NET..
  2. No menu ficheiro , aponte para Novo e, em seguida, clique em projecto .
  3. Clique em Projectos do Visual C++ em Project Types e, em seguida, clique em Aplicação MFC em modelos .
  4. Na caixa de texto nome , escreva Q148652 .
  5. Na caixa de texto localização , escreva c:\teste e, em seguida, clique em OK .
  6. Na caixa de diálogo Assistente de aplicação MFC , clique em Tipo de aplicação .
  7. Clique em caixa de diálogo com base em tipo de aplicação e clique em Utilizar MFC numa biblioteca estática em Utilização de MFC .
  8. Clique em Concluir .
  9. No Solution Explorer, em Ficheiros de origem , seleccione todos os três ficheiros de .cpp.
  10. Clique com o botão direito do rato três ficheiros seleccionados e, em seguida, clique em Remover .
  11. Clique com o botão direito do rato ficheiros de origem , aponte para Adicionar e, em seguida, clique em Adicionar novo item .
  12. Clique em C++ ficheiros em modelos . Na caixa de texto nome , escreva Aa . Clique em Abrir .
  13. Cole o código seguinte no ficheiro Aa.cpp:
    int test(){new int; return 1;}
  14. Clique com o botão direito do rato em Ficheiros de origem , aponte para Adicionar e, em seguida, clique em Adicionar Item existente .
  15. Seleccione os seguintes ficheiros:
    • Q148652.cpp
    • Q148652Dlg.cpp
    • Stdafx.cpp
  16. Clique em Abrir .
  17. Os ficheiros que seleccionou no passo 15 aparecem em Ficheiros de origem .
  18. Seleccione os quatro ficheiros .cpp em origem ficheiros .
  19. Clique com o botão direito do rato os quatro ficheiros .cpp que seleccionou e, em seguida, clique em Propriedades .
  20. Expanda Propriedades de configuração e expanda C/C ++ .
  21. Clique em pré-compilada cabeçalhos .
  22. Definir o Cabeçalho da pré-compilada criar/utilizar a propriedade para Não utilizar pré-compilada cabeçalhos . Clique em OK .
  23. No menu criar , clique em recriar a solução .

Propriedades

Artigo: 148652 - Última revisão: 13 de março de 2008 - Revisão: 7.1
A informação contida neste artigo aplica-se a:
  • Microsoft Visual C++ 2008 Express Edition
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 4.1 Subscription
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
Palavras-chave: 
kbmt kbsweptvs2008 kbtshoot kbarttypeinf kberrmsg kbprb KB148652 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 148652

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com