Erreur de type LNK 2005

BenGourion73 Messages postés 9 Date d'inscription mardi 19 décembre 2000 Statut Membre Dernière intervention 2 mars 2009 - 18 août 2008 à 15:56
BenGourion73 Messages postés 9 Date d'inscription mardi 19 décembre 2000 Statut Membre Dernière intervention 2 mars 2009 - 20 août 2008 à 19:00
Bonjour,

J'ai une solution en développement qui se compose d'une librairie statique et d'un exécutable. La librairie statique compile bien toute seule. Quand l'exécutable est compilé, pas d'erreur jusqu'à l'étape d'éditions des liens où plusieurs message du type suivant apparaissent :

msvcprtd.lib(MSVCP80D.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::~basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(void)" (??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) déjà défini(e) dans libelementaire.lib(C_Calendar.obj)

et surtout :

nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) déjà défini(e) dans MSVCRTD.lib(MSVCR80D.dll)

Le compilateur indique donc que plusieurs symboles serait définis plusieurs fois dans le programme mais comme pour certains, il s'agit de symboles génériques type operator new ou delete, je pense que l'erreur provient soit  :

- d'un problème de config de projets ;
- d'un include multiple d'un même fichier de base stdafx.h ou autre.

Pour ce qui est de savoir si ça vient d'un pb de config de projets, j'ai essayé de reproduire le pb en montant un projet identique (mais pas avec les mêmes fichiers sources) mais là pas d'erreur ce qui me laisse penser que l'erreur ne vient pas de là mais si cette expérience me semble insuffisante pour éliminer totalement cette hypothèse...

Alors qui a une idée ?

5 réponses

BenGourion73 Messages postés 9 Date d'inscription mardi 19 décembre 2000 Statut Membre Dernière intervention 2 mars 2009
18 août 2008 à 17:33
Je viens de m'apercevoir que le projet chargé de générer le .lib de la librairie statique générait à la place un .obj. Comme par ailleurs, j'ai dans ce projet un fichier source portant le nom du projet. Du coup, peut-être que Visual C++ n'aime pas que le .lib porte le même nom qu'un fichier source...
0
cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
19 août 2008 à 18:06
Dans les propriétés de projet , à la section génération de code, il y a une option Bibliothèque Runtime.
Il faut que tu compiles la librairie et l'application avec la même option de compilation.
0
BenGourion73 Messages postés 9 Date d'inscription mardi 19 décembre 2000 Statut Membre Dernière intervention 2 mars 2009
19 août 2008 à 18:55
Merci,

J'ai déjà vérifié que l'exe et le .lib ont bien la même bibliothèque de runtime. Par contre, je pense que mon erreur vient du fait que dans la librairie, j'ai des math.h et string.h propres différents de ceux de la librairie C++ standard... Je suis en train de voir de quoi il retourne...
0
cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
19 août 2008 à 23:21
En c++, utilises de préférence

#include<string>
#include<cmath>

au lieu de

#include<string.h>

#include<math.h>

Sinon, vérifie également que tu n'as pas une option /clr (code managé) en trop ( ou en moins )...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BenGourion73 Messages postés 9 Date d'inscription mardi 19 décembre 2000 Statut Membre Dernière intervention 2 mars 2009
20 août 2008 à 19:00
C'est bon, j'ai trouvé. Bon pour que d'autres développeurs ne rament pas avec cette saloperie d'erreur de LINK 2005, voici comment repérer la source du problème :
1/ Mettez l'option /VERBOSE:LIB dans l'Editeur de liens  ---- > ça permet d'avoir un retour sur les librairies recherchées par Visual Studio au moment de l'éditien des liens
2/ Mettez bien sur la même bibliothèque de RunTime dans tous les projets de votre solution mais ça ne suffit pas ...
3/ ...car il faut s'assurer que la liste des bibliothèques recherchées mise en évidence gràce au setting /VERBOSE:LIB du 1/ colle bien avec des librairies compatibles avec celle choisie pour le Runtime.
 
Pour utiliser cette bibliothèque runtime |Ignorer ces bibliothèques |----
Un seul thread (libc.lib), libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib, ----
Multithread (libcmt.lib), libc.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib, ----
Multithread utilisant des DLL (msvcrt.lib), libc.lib, libcmt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib, ----
Un seul thread débogage (libcd.lib), libc.lib, libcmt.lib, msvcrt.lib, libcmtd.lib, msvcrtd.lib, ----
Multithread débogage (libcmtd.lib), libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, msvcrtd.lib, ----
Multithread débogage utilisant des DLL (msvcrtd.lib), libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib

Attention si mon erreur de LINK apparaissait c'est que Visual Studio ne respecte pas automatiquement pas les règles du tableau précédent. Ceci étant dit, deux solutions :

1/ Mettre dans C/C++ --- > Avancé --- >Omettre les noms de bibliothèque par défaut la valeur Oui (Zl)

Ou

2/ Spécifier dans Editeur de liens --- > Bibiothèque spécifique ignorée  avec pour chaque librairie XXX à ignorer la commande /NODEFAULTLIB:XXX, chaque instruction séparée d'un pt virgule.
0
Rejoignez-nous