13

Oggi ho incontrato un problema di collegamento dopo l'aggiornamento della versione VS 2008-2010, l'errore è qualcosa di simile:errore di collegamento dopo l'aggiornamento da VS2008 a 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]) 

Googled questa edizione sul web, e trovato un post simile in questo indirizzo: http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/5ac28a31-3339-4db1-90f4-68edad360309

Ma nessuna di queste risposte può risolvere il mio problema. Qualcuno potrebbe darmi qualche consiglio su come risolvere questo problema?

Grazie mille per l'aiuto!

+0

In particolare per questo errore linker, Xran e Xlen sono due funzioni che esistono nella versione VS2008 di std :: basic_string ma non esistono in la versione VS2010. Quindi, quando si tenta di collegare questa libreria in VS2010, non riesce a trovare queste funzioni e richiama un errore. – Philip

risposta

12

Il problema è molto probabile che una delle librerie con cui si collega il file .exe sia stata creata con una versione precedente di Visual Studio. Poiché questa libreria "altro" è stata compilata con una versione precedente di VS, sta cercando le versioni precedenti delle funzioni _XRan e _XLen nel runtime C di VS2010. MS li ha modificati (ancora una volta) e le loro vecchie funzioni non esistono nel runtime VS2010.

antiche: pubblico: static void __cdecl std :: _ String_base :: _ Xran (void)

nuovo: public: void __thiscall std :: basic_string :: _ Xran (void) (questo potrebbe essere sbagliato, ma si ottiene l'idea)

ci sono tre possibili correzioni:

1) compilare tutte le librerie con VS 2010

2) Utilizzare la versione precedente di VS per compilare il codice

3) Riscrive le implementazioni _XRan e _XLen esistenti e sovrascrive nel linker (vedere la spiegazione di JN123 in http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/5ac28a31-3339-4db1-90f4-68edad360309).

2

Goto le impostazioni del progetto:

proprietà di configurazione Generale - strumento Piattaforma impostati

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

Cosa fa? Com'è meglio della risposta di Jess? Ho questo problema e non sono sicuro di come risolverlo. – Tim

1

Goto le impostazioni del progetto:

proprietà di configurazione generale - strumento Piattaforma impostato

Visual Studio 2010 - VC100. studio visivo 2008 - vc90. studio visivo 2005 - vc80.

Questo richiede tutte queste versioni di Visual Studio installate sul sistema. In caso contrario, si verificherà un errore come questo: "Il set di strumenti della piattaforma specificato (v90) richiede Visual Studio 2008. Assicurati che Visual Studio 2008 sia installato sulla macchina."

2

Di fronte allo stesso problema di migrazione per il 2008 al 2012. Sembra che MS continui a giocare con le firme di queste funzioni. La mia decisione è solo quella di dare al linker quello che vuole.Ho messo codice successivo nella cpp del mio progetto e linker stavo zitto:

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

Questo ha funzionato per me. Dovevo solo aggiungere "#include ". – Lucas

+0

Funziona! Grazie! – MajesticRa