Um erro LNK2005 ocorre quando as bibliotecas CRT e MFC estão vinculadas na ordem errada no Visual C++

Traduções deste artigo Traduções deste artigo
ID do artigo: 148652 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

Quando as bibliotecas C Run-Time (CRT) e Microsoft Foundation Class (MFC) estão vinculadas na ordem errada, você pode receber um dos seguintes erros LNK2005:
nafxcwd.lib(afxmem.obj) : error LNK2005:
"void * __cdecl operator new(unsigned int)"(??2@YAPAXI@Z) already
defined in LIBCMTD.lib(new.obj)
nafxcwd.lib(afxmem.obj) : error LNK2005:
"void __cdecl operator delete(void *)"(??3@YAXPAX@Z) already defined
in LIBCMTD.lib(dbgnew.obj)
nafxcwd.lib(afxmem.obj) : error LNK2005:
"void * __cdecl operator new(unsigned int,int,char const *,int)"
(??2@YAPAXIHPBDH@Z) already defined in LIBCMTD.lib(dbgnew.obj)
mfcs40d.lib(dllmodul.obj): error LNK2005: _DllMain@12 already defined in
MSVCRTD.LIB (dllmain.obj)
mfcs42d.lib(dllmodul.obj): error LNK2005: _DllMain@12 already defined in
msvcrtd.lib(dllmain.obj)

Causa

As bibliotecas CRT usam ligação externa fraca para as funções new, delete e DllMain. As bibliotecas MFC também contêm funções new, delete e DllMain. Essas funções exigem que as bibliotecas MFC sejam vinculadas antes da biblioteca CRT.

Resolução

Há duas formas de resolver o problema. A primeira solução envolve forçar o vinculador a vincular as bibliotecas na ordem correta. A segunda solução permite que você localize o módulo que está causando o problema e corrigi-lo.

Observação As seguintes etapas baseiam-se no Visual C++ 6.0.

Solução um: Forçar o vinculador a vincular as bibliotecas na ordem correta

  1. No menu Project, clique em Settings.
  2. No modo de exibição Settings For da caixa de diálogo Project Settings, selecione a configuração de projeto que está gerando os erros no link.
  3. Na guia Link, selecione Input na caixa de combinação Category.
  4. Na caixa Ignore libraries, insira os nomes da biblioteca (por exemplo, Nafxcwd.lib;Libcmtd.lib).

    Observação O equivalente da linha de comando do vinculador em /NOD:<nome_da_biblioteca>.
  5. Na caixa Object/library modules, insira os nomes da biblioteca. Você deve verificar se eles estão relacionados em ordem e como sendo as duas primeiras bibliotecas na linha (por exemplo, Nafxcwd.lib Libcmtd.lib).
Para definir a opção no Visual C++ .NET, leia o tópico da ajuda online "Setting Visual C++ Project Properties".

Solução dois: Localizar e corrigir o módulo com o problema

Para visualizar a ordem do link para a biblioteca atual, execute as seguintes etapas:
  1. No menu Project, clique em Settings.
  2. No modo de exibição Settings For da caixa de diálogo Project Settings, selecione a configuração de projeto que está gerando os erros no link.
  3. Na guia Link, digite /verbose:lib na caixa Project Options.
  4. Refaça o projeto. As bibliotecas serão relacionadas na janela de saída durante o processo de vinculação.

Situação

Este comportamento é próprio do projeto.

Mais Informações

Quando você usa as bibliotecas MFC, verifique se elas estão vinculadas antes da biblioteca CRT estar vinculada. Isso pode ser feito, verificando se todos os arquivos do projeto apresentam Msdev\Mfc\Include\Afx.h primeiro, direta (#include <Afx.h>) ou indiretamente (#include <Stdafx.h>). O arquivo de inclusão Afx.h força a ordem correta das bibliotecas, usando a diretiva de comentários #pragma (lib,"<libname>").

Caso o arquivo de origem tenha uma extensão .c ou .cpp, mas não use MFC, é possível criar e incluir um arquivo de cabeçalho pequeno (Forcelib.h) na parte superior do módulo. O novo cabeçalho assegura a ordem correta da pesquisa thelibrary.

O Visual C++ não contém o arquivo de cabeçalho. Para criar o arquivo, execute as seguintes etapas:
  1. Abra Msdev\Mfc\Include\Afx.h.
  2. Selecione as linhas entre #ifndef _AFX_NOFORCE_LIBS e #endif //!_AFX_NOFORCE_LIBS.
  3. Copie a seleção para a Área de transferência do Windows.
  4. Crie um novo arquivo de texto.
  5. Cole o conteúdo da Área de transferência no novo arquivo.
  6. Salve o arquivo como Msdev\Mfc\Include\Forcelib.h.

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

  1. Inicie o Microsoft Visual Studio .NET.
  2. No menu File, aponte para New e clique em Project.
  3. Clique em Visual C++ Projects, em Project Types, e clique em MFC Application, em Templates.
  4. Na caixa de texto Name, digite Q148652.
  5. Na caixa de texto Location, digite C:\Test e clique em OK.
  6. Na caixa de diálogo MFC Application Wizard, clique em Application Type.
  7. Clique em Dialog based, em Application type, e clique em Use MFC in a static library, em Use of MFC.
  8. Clique em Finish.
  9. No Solution Explorer, em Source Files, selecione todos os três arquivos .cpp.
  10. Clique com o botão direito do mouse nos três arquivos selecionados e clique em Remove.
  11. Clique com o botão direito do mouse em Source files, aponte para Add e clique em Add New Item.
  12. Clique em C++ files, em Templates. Na caixa de texto Name, digite Aa. Clique em Open.
  13. Cole o seguinte código no arquivo Aa.cpp:
    int test(){new int; return 1;}
  14. Clique com o botão direito do mouse em Source Files, aponte para Add e clique em Add Existing Item.
  15. Selecione os seguintes arquivos:
    • Q148652.cpp
    • Q148652Dlg.cpp
    • stdafx.cpp
  16. Clique em Open.
  17. Os arquivos selecionados na etapa 15 são exibidos em Source Files.
  18. Selecione todos os quatro arquivos .cpp em Source Files.
  19. Clique com o botão direito do mouse nos quatro arquivos .cpp selecionados e clique em Properties.
  20. Expanda Configuration Properties e C/C++.
  21. Clique em Precompiled Headers.
  22. Configure a propriedade Create/Use Precompiled Header como Not Using Precompiled Headers. Clique em OK.
  23. No menu Build, clique em Rebuild Solution.

Propriedades

ID do artigo: 148652 - Última revisão: quinta-feira, 25 de maio de 2006 - Revisão: 7.0
A informação contida neste artigo aplica-se a:
  • 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: 
kberrmsg kbtshoot kbprb kbarttypeinf KB148652

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