Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
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)
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.
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
No menu Project, clique em
Settings.
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.
Na guia Link, selecione
Input na caixa de combinação
Category.
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>.
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".
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:
Abra Msdev\Mfc\Include\Afx.h.
Selecione as linhas entre #ifndef _AFX_NOFORCE_LIBS e
#endif //!_AFX_NOFORCE_LIBS.
Copie a seleção para a Área de transferência do Windows.
Crie um novo arquivo de texto.
Cole o conteúdo da Área de transferência no novo arquivo.
Salve o arquivo como
Msdev\Mfc\Include\Forcelib.h.
Quanto esforço foi necessário para seguir os procedimentos deste artigo?
Muito baixo
Baixo
Moderado
Alto
Muito alto
Diga-nos o porque e o que podemos fazer para melhorar esta informação
Obrigado! Seus comentários são usados para nos ajudar a aperfeiçoar o conteúdo de suporte. Para obter mais opções de ajuda, visite a Home Page de Ajuda e Suporte.