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


Uso c++11, pero también algunas bibliotecas que no están configuradas para ello, y necesitan alguna conversión de tipo. En particular, necesito una manera de convertir std::__cxx11::string a std::string regular, pero buscar en Google no puedo encontrar una manera de hacer esto y poner (string) al frente no funciona.

Si no convierto obtengo errores de enlazador 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'
Author: Baum mit Augen, 2015-10-28

4 answers

¿ Es posible que esté utilizando GCC 5?

Si obtiene errores de enlazador sobre referencias indefinidas a símbolos que involucran tipos en el espacio de nombres std::__cxx11 o la etiqueta [abi:cxx11], probablemente indique que está tratando de vincular archivos objeto que se compilaron con diferentes valores para la macro _GLIBCXX_USE_CXX11_ABI. Esto sucede comúnmente cuando se enlaza 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 el nuevo ABI, entonces tendrá que recompilar su código con el ABI antiguo.

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

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

 76
Author: Matthäus Brandl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-28 15:52:16

Si puede recompilar todas las librerías incompatibles que use, hágalo con la opción del compilador

- D_GLIBCXX_USE_CXX11_ABI = 1

Y luego reconstruye tu proyecto. Si no puede hacerlo, agregue a la opción compilador de makefile de su proyecto

- D_GLIBCXX_USE_CXX11_ABI = 0

La definición

# define _GLIBCXX_USE_CXX11_ABI 0/1

También es bueno, pero probablemente necesite agregarlo a todos sus archivos mientras que la opción del compilador lo hace para todos los archivos simultáneamente.

 40
Author: Denis Sirotkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-27 08:12:10

Tengo esto, la única manera que encontré para arreglar esto fue actualizar todo mingw-64 (lo hice usando pacman en msys2 para su información).

 0
Author: ceorron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-28 21:18:24

Para mí-D_GLIBCXX_USE_CXX11_ABI=0 no ayudó.

Funciona después de enlazar a la versión libs de C++ en lugar de gnustl.

 0
Author: dimon4eg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-24 11:09:37