web-dev-qa-db-fra.com

erreur LNK2005: new et delete déjà définis dans LIBCMTD.lib (new.obj)

J'ai une solution Visual studio 2005 qui a deux projets. L'une est une bibliothèque statique et l'autre est un exécutable utilisé pour tester les fonctionnalités de la bibliothèque statique. La bibliothèque statique utilise MFC. J'ai eu les erreurs suivantes lorsque j'ai construit la solution. 

uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj)
uafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??    3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj)
uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmtd.lib(newaop.obj)
uafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) already defined in LIBCMTD.lib(delete2.obj)

Je ne sais pas comment surmonter cela. Quelqu'un peut-il s'il vous plaît expliquer pourquoi cette erreur se produit. Toute explication donnant un aperçu du couplage de fichiers .lib sera vivement appréciée. 

30
user59988

Les bibliothèques CRT utilisent un lien externe faible pour les nouvelles fonctions, supprimer et DllMain. Les bibliothèques MFC contiennent également des fonctions nouvelles, de suppression et DllMain. Ces fonctions nécessitent que les bibliothèques MFC soient liées avant que la bibliothèque CRT ne soit liée. http://support.Microsoft.com/kb/148652

Solution basée sur VS2005 (remplacez Nafxcwd.lib par Uafxcwd.lib pour ~ VS2013)

allez dans projet> propriétés> propriétés de configuration> éditeur de liens> entrée

ajouter à "Dépendance supplémentaire" -> Nafxcwd.lib Libcmtd.lib

ajouter à "ignorer une bibliothèque spécifique" -> Nafxcwd.lib; Libcmtd.lib

l'ordre des bibliothèques est important (Nafxcwd.lib; Libcmtd.lib).

61
ali

Une chose à essayer est de vous assurer que vous avez:

#include "stdafx.h"

en tant que première ligne de vos fichiers .cpp. Je suis sûr que ce n'est pas la solution dans tous les cas, mais cela a fait disparaître l'erreur identique dans mon cas.

8
Andrew Jens

dans l'entrée de l'éditeur de liens de configuration

  • Dans des dépendances supplémentaires, mettez uafxcw.lib; LIBCMT.lib
  • Dans Ignorer spécifique put put uafxcw.lib; LIBCMT.lib
4
eit

assurez-vous d'avoir #include <afx.h> dans "stdafx.h" AVANT que d'autres inclus comme #include <string>

4
user2199593

Je rencontre ce problème dans une solution MFC de Visual Studio 2010 , tout en remplaçant Use MFC in a Shared DLL par Use MFC in a Static Library dans Projet -> Propriétés -> Propriétés de configuration -> Général

Je résous le problème par les moyens suivants. Veuillez localiser Projet -> Propriétés -> Propriétés de configuration -> Éditeur de liens -> Entrée au début.

En mode débogage:

  • Ajouter uafxcwd.lib;Libcmtd.lib dans Dépendances supplémentaires .
  • Ajouter uafxcwd.lib;Libcmtd.lib dans Ignorer les bibliothèques spécifiques par défaut .

En mode de libération:

  • Ajouter uafxcw.lib;Libcmt.lib dans Dépendances supplémentaires .
  • Ajouter uafxcw.lib;Libcmt.lib dans Ignorer les bibliothèques spécifiques par défaut .

Remarquer:

  1. Ne manquez pas le ; entre les deux fichiers .lib.
  2. Un suffixe -d doit être ajouté dans les fichiers en mode débogage.
2
Cipher Saw

Assurez-vous que la bibliothèque d'exécution C++ à laquelle vous liez est identique sur votre bibliothèque statique et sur votre exécutable. Vérifiez les propriétés de votre projet C/C++ -> Génération de code-> Paramètres de la bibliothèque d'exécution.

2
msvcyc

Pour moi, j'ai une bibliothèque statique compilée avec _CRTDBG_MAP_ALLOC et l'application non compilée avec _CRTDBG_MAP_ALLOC, je recevais alors LNK2005. J'ai changé l'application à compiler avec _CRTDBG_MAP_ALLOC et le LNK2005 a disparu.

1
boutinr

Faute de frappe. Une façon stupide que vous avez obtenue est d’inclure l’en-tête au lieu d’inclure l’en-tête cpp .

#include <myclass.cpp> //should be #include <myClass.h>
1
Gob00st

S'est débarrassé du problème

uafxcwd.lib(afxmem.obj) : warning LNK4006: "void * __cdecl operator new(unsigned __int64)"
  • Dans Ignorer spécifique put put uafxcw.lib.
  • In Ignore specific put put uafxcw.lib.

Premièrement, libcmtd.lib est pour une version de débogage et libcmt.lib est pour la production. Vérifiez que vous n'incluez pas les deux. Un endroit à vérifier est la section "Ligne de commande" des propriétés du projet Propriétés de configuration/lieur.

Si vous accédez aux propriétés du projet et ouvrez la section Propriétés de configuration/lieur/entrée, vous pouvez "bibliothèque spécifique à Ingore" ... essayez de répertorier libcmtd.lib dans ce champ.

1
Mark Laff

Pour moi, le problème a été résolu en changeant

Projet -> Propriétés -> Propriétés de configuration -> Général: Utilisation de MFC = Utiliser MFC dans une DLL partagée

Avant, il était réglé sur "Utiliser les bibliothèques Windows standard"

De plus, je devais définir l'option/MD sous

Projet -> Propriétés -> C/C++ -> Génération de code: Bibliothèque d'exécution = Multi-threaded DLL (/ MD)

0
flexo

Un fichier d'en-tête déclaré et défini une variable. Les solutions possibles incluent: Déclarez la variable dans .h: extern BOOL MyBool; et ensuite lui affecter dans un fichier .c ou .cpp: BOOL MyBool = FALSE; . Déclarer la variable static . Déclarer la variable.

https://msdn.Microsoft.com/en-us/library/72zdcz6f.aspx

0
usman chaudhry

J'ajouterai également que si vous avez remplacé les nouveaux opérateurs/delete (et si c'est le cas, veuillez créer le tableau et le scalaire), vous devrez peut-être les marquer comme __forceinline afin que l'objet n'entre pas en collision avec la lib.

Par exemple, je les ai utilisées pour forcer des allocations alignées et j'ai eu le même problème jusqu'à ce que je le fasse:

__forceinline void * operator new(size_t size)
{
    return _aligned_malloc(size, 16);
}
__forceinline void operator delete(void* ptr)
{
    _aligned_free(ptr);
}
__forceinline void * operator new [](size_t size)
{
    return _aligned_malloc(size, 16);
}
__forceinline void operator delete [](void* ptr)
{
    _aligned_free(ptr);
}
0
Dave

J'ai aussi eu un problème similaire. Le lien donné par Donnie explique la raison. La solution consistait à examiner les messages d'erreur, puis à supprimer les bibliothèques impliquées et à les ajouter dans l'ordre des bibliothèques MFC, puis des bibliothèques CRT. 

Le moyen de faire cela en vs2008 est donné par ALi. 

0
user36476

Vérifiez le fichier manifeste des deux projets, assurez-vous qu'ils lient la même version de la bibliothèque standard. Probablement pas, vérifiez les liens propriétés-> génération de code-> bibliothèque standard.

0
DeusAduro