13

Hoy me encontré con un problema de enlace después de actualizar la versión VS desde 2008 a 2010, el error es algo como esto:Error de enlace después de la actualización de 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]) 

He buscado en Google este tema en la web, y encontró una publicación similar en esta dirección: http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/5ac28a31-3339-4db1-90f4-68edad360309

Pero ninguna de estas respuestas puede resolver mi problema. ¿Alguien podría darme algunos consejos sobre cómo resolver este problema?

¡Muchas gracias por la ayuda!

+0

específicamente para este error de vinculador, Xran y Xlen son dos funciones que existen en la versión VS2008 de std :: basic_string pero no existen en la versión VS2010. Por lo tanto, cuando intenta vincular esta biblioteca en VS2010, no puede encontrar estas funciones y llama a un error. – Philip

Respuesta

12

El problema es muy probable que una de las bibliotecas con las que enlaza su .exe esté construida con una versión anterior de Visual Studio. Debido a que esta "otra" biblioteca se compiló con una versión anterior de VS, está buscando las versiones anteriores de las funciones _XRan y _XLen en el tiempo de ejecución VS2010 C. MS los ha cambiado (una vez más) y las antiguas firmas de funciones no existen en el tiempo de ejecución VS2010.

edad: public: void __cdecl std :: _ :: _ String_base Xran (void)

nuevo: public void __thiscall std :: :: _ basic_string Xran (void) (esto podría estar equivocado, pero se obtiene la idea)

Hay tres posibles correcciones:

1) recopilar todas las bibliotecas con VS 2010

2) Utilice la versión anterior de VS para compilar el código

3) Reescriba las implementaciones _XRan y _XLen existentes y anule en el enlazador (vea la explicación de JN123 en http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/5ac28a31-3339-4db1-90f4-68edad360309).

2

Goto la configuración del proyecto:

propiedades de configuración general - herramienta Plataforma establecen

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

¿Qué hace esto? ¿Cómo es mejor que la respuesta de Jess? Tengo este problema y no estoy seguro de cómo resolverlo. – Tim

1

Goto la configuración del proyecto:

propiedades generales de configuración - herramienta Plataforma fija

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

Esto requiere todas estas versiones de Visual Studio instaladas en su sistema. De lo contrario, obtendrá un error como este: "El conjunto de herramientas de plataforma especificado (v90) requiere Visual Studio 2008. Asegúrese de que Visual Studio 2008 esté instalado en la máquina".

2

Se enfrentó el mismo problema al migrar de 2008 a 2012. Parece que MS sigue jugando con las firmas de estas funciones. Mi decisión es solo darle al enlazador lo que quiere.He colocado junto código en el CPP de mi proyecto y enlazador encerraron:

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

Esto funcionó para mí. Solo tuve que agregar '#include '. – Lucas

+0

¡Funciona! ¡Gracias! – MajesticRa

Cuestiones relacionadas