Conversión de std::__cxx11::string a std::string

Resuelto jorgen asked hace 9 años • 9 respuestas

Utilizo c++ 11, pero también algunas bibliotecas que no están configuradas para ello y necesitan alguna conversión de tipos. En particular, necesito una forma de convertir std::__cxx11::stringa regular std::string, pero buscando en Google no puedo encontrar una manera de hacerlo y ponerlo (string)al frente no funciona.

Si no convierto, obtengo errores del vinculador como este:

undefined reference to `H5::CompType::insertMember(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long, H5::DataType const&) const'
jorgen avatar Oct 28 '15 22:10 jorgen
Aceptado

¿Es posible que estés usando GCC 5?

Si obtiene errores del vinculador sobre referencias no definidas a símbolos que involucran tipos en el espacio de nombres std::__cxx11 o la etiqueta [abi:cxx11], entonces probablemente indica que está intentando vincular archivos de objetos que se compilaron con valores diferentes para _GLIBCXX_USE_CXX11_ABI. macro. Esto sucede comúnmente cuando se vincula a una biblioteca de terceros que se compiló con una versión anterior de GCC. Si la biblioteca de terceros no se puede reconstruir con la nueva ABI, deberá volver a compilar su código con la ABI anterior.

Fuente: Notas de la versión de GCC 5/ABI dual

Definir la siguiente macro antes de incluir cualquier encabezado de biblioteca estándar debería solucionar su problema:#define _GLIBCXX_USE_CXX11_ABI 0

Brandlingo avatar Oct 28 '2015 15:10 Brandlingo

Si puede recompilar todas las bibliotecas incompatibles que utiliza, hágalo con la opción del compilador

-D_GLIBCXX_USE_CXX11_ABI=1

y luego reconstruir su proyecto. Si no puede hacerlo, agregue a la opción del compilador makefile de su proyecto

-D_GLIBCXX_USE_CXX11_ABI=0

la definición

#definir _GLIBCXX_USE_CXX11_ABI 0/1

También es bueno, pero probablemente necesites agregarlo a todos tus archivos, mientras que la opción del compilador lo hace para todos los archivos a la vez.

Denis Sirotkin avatar May 27 '2016 08:05 Denis Sirotkin

Cuando tuve un problema similar, sucedió porque mi biblioteca se compiló usando clang++y está vinculada libstdc++.sode forma predeterminada en mi sistema. Mientras que el binario de la aplicación se creó utilizando la opción clangy se vinculó con -lc++ella.

La forma más sencilla de comprobar las dependencias es realizarldd libName.so

Para solucionarlo, debes usar la misma biblioteca en la aplicación y en la biblioteca.

  • La manera más fácil. Cree una biblioteca usando clang++y compile la aplicación usando clang++. Sin opciones de vinculación adicionales en ambos pasos. Se utilizará stdlib predeterminado.

  • Cree una biblioteca -stdlib=c++y compile la aplicación con -lc++. En este caso se utilizará tanto la biblioteca como la aplicación libc++.so.

  • Cree una biblioteca sin opciones adicionales y vincule el binario a -lstdc++. En este caso se utilizará tanto la biblioteca como la aplicación libstdc++.so.

Evgen Bodunov avatar Jul 30 '2019 10:07 Evgen Bodunov

Las respuestas aquí se centran principalmente en una forma breve de solucionarlo, pero si eso no ayuda, daré algunos pasos para verificar que me ayudaron (solo Linux):

  • Si los errores del vinculador ocurren al vincular otras bibliotecas, cree esas bibliotecas con símbolos de depuración ("-g" indicador GCC)
  • Enumere los símbolos en la biblioteca y busque los símbolos de los que se queja el vinculador (ingrese los comandos en la línea de comandos):

    nm lib_your_problem_library.a | grep functionNameLinkerComplainsAbout

  • Si obtuvo la firma del método, continúe con el siguiente paso; si la obtuvo no symbols, lo más probable es que haya eliminado todos los símbolos de la biblioteca y es por eso que el vinculador no puede encontrarlos al vincular la biblioteca. Reconstruya la biblioteca sin eliminar TODOS los símbolos; puede eliminar strip -Slos símbolos de depuración (opción) si es necesario.

  • Utilice un demangler de C++ para comprender la firma del método, por ejemplo, este

  • Compare la firma del método en la biblioteca que acaba de obtener con la que está usando en el código (verifique también el archivo de encabezado), si son diferentes, use el encabezado adecuado o la biblioteca adecuada o cualquier otra forma que conozca para solucionarlo.
rightaway717 avatar Jul 03 '2019 14:07 rightaway717