BenGourion73
Messages postés9Date d'inscriptionmardi 19 décembre 2000StatutMembreDernière intervention 2 mars 2009
-
18 août 2008 à 15:56
BenGourion73
Messages postés9Date d'inscriptionmardi 19 décembre 2000StatutMembreDerniè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...
BenGourion73
Messages postés9Date d'inscriptionmardi 19 décembre 2000StatutMembreDerniè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...
cs_Lucky92
Messages postés180Date d'inscriptionmercredi 22 décembre 2004StatutMembreDernière intervention16 août 20122 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.
BenGourion73
Messages postés9Date d'inscriptionmardi 19 décembre 2000StatutMembreDerniè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...
BenGourion73
Messages postés9Date d'inscriptionmardi 19 décembre 2000StatutMembreDerniè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.