13

Aujourd'hui, je rencontrais un problème de liaison après la mise à jour de la version VS de 2008 à 2010, l'erreur est quelque chose comme ceci:erreur de liaison après la mise à jour de VS2008 à VS2010

error LNK2019: unresolved external symbol "public: static void __cdecl std::_String_base::_Xran(void)" ([email protected][email protected]@@SAXXZ) referenced in function "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::assign(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,unsigned int,unsigned int)" ([email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]) 

error LNK2019: unresolved external symbol "public: static void __cdecl std::_String_base::_Xlen(void)" ([email protected][email protected]@@SAXXZ) referenced in function "protected: bool __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::_Grow(unsigned int,bool)" ([email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]) 

Je googled cette question sur le web, et trouvé un poste similaire dans cette adresse: http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/5ac28a31-3339-4db1-90f4-68edad360309

Mais aucune de ces réponses ne peut résoudre mon problème. Quelqu'un pourrait-il me donner quelques conseils sur la façon de résoudre ce problème?

Merci beaucoup pour votre aide!

+0

Plus précisément pour cette erreur de liaison, Xran et Xlen sont deux fonctions qui existent dans la version VS2008 de std :: basic_string mais n'existent pas dans la version VS2010. Donc, lorsque vous essayez de lier cette bibliothèque dans VS2010, il ne peut pas trouver ces fonctions et appelle une erreur. – Philip

Répondre

12

Le problème est très probablement lié à l'une des bibliothèques avec lesquelles votre fichier .exe est lié a été créé avec une version antérieure de Visual Studio. Comme cette bibliothèque "other" a été compilée avec une version précédente de VS, elle recherche les versions précédentes des fonctions _XRan et _XLen dans le runtime VS2010 C. MS les a changé (encore une fois) et les vieilles signatures de fonction n'existent pas dans le runtime VS2010.

vieux: public: __cdecl static void std :: _ String_base :: _ Xran (void)

nouveau: public: __thiscall vide std :: basic_string :: _ Xran (void) (cela peut se tromper, mais vous obtenez l'idée)

Il y a trois solutions possibles:

1) compiler toutes les bibliothèques avec VS 2010

2) Utilisez l'ancienne version de VS pour compiler votre code

3) Réécrire les implémentations _XRan et _XLen existantes et remplacer dans l'éditeur de liens (voir l'explication de JN123 dans http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/5ac28a31-3339-4db1-90f4-68edad360309).

2

Goto vos paramètres du projet:

propriétés de configuration générales - Outil de plate-forme mis

  1. visual studio 2010 - VC100.
  2. studio visuel 2008 - vc90.
  3. Visual Studio 2005 - vc80.
+0

Qu'est-ce que cela fait? Comment est-ce mieux que la réponse de Jess? J'ai ce problème et je ne sais pas comment le résoudre. – Tim

1

Goto vos paramètres du projet:

propriétés de configuration générale - Outil de plate-forme mis

visual studio 2010 - VC100. studio visuel 2008 - vc90. studio visuel 2005 - vc80.

Cela nécessite toutes ces versions de Visual Studio installées sur votre système. Sinon, vous obtiendrez une erreur comme celle-ci: "Le jeu d'outils de la plate-forme spécifiée (v90) nécessite Visual Studio 2008. Assurez-vous que Visual Studio 2008 est installé sur la machine."

2

Face au même problème de migration pour 2008 à 2012. Il semble que MS joue toujours avec les signatures de ces fonctions. Ma décision est juste de donner au linker ce qu'il veut.J'ai placé le code suivant dans mon cpp de projet et éditeur de liens était enfermé:

namespace std 
{ 
    class _String_base 
    { 
    public: 
     static void _cdecl _Xlen(void) ; 
     static void _cdecl _Xran(void) ; 
    }; 
}; 

void _cdecl std::_String_base::_Xlen(void) 
{ // report a length_error 
_Xlength_error("string too long"); 
} 
void _cdecl std::_String_base::_Xran(void) 
{ // report an out_of_range error 
_Xout_of_range("invalid string position"); 
} 
+0

Cela a fonctionné pour moi. Il suffit d'ajouter '#include '. – Lucas

+0

Ça marche! Je vous remercie! – MajesticRa

Questions connexes