metodos library example declarar c++ string c++11 types std

library - string c++ example



Convertir std::__ cxx11:: string a std:: string (6)

¿Es posible que esté utilizando GCC 5?

Si obtiene errores de vinculador sobre referencias indefinidas 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 compilados con diferentes valores para _GLIBCXX_USE_CXX11_ABI macro. Esto ocurre 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 el nuevo ABI, deberá volver a compilar su código con el antiguo ABI.

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

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

Uso c ++ 11, pero también algunas bibliotecas que no están configuradas para ello, y necesitan algún tipo de conversión. En particular, necesito una forma de convertir std::__cxx11::string a std::string normal, pero buscando en Google no puedo encontrar una manera de hacerlo 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''


Cuando tuve un problema similar, sucedió porque mi lib fue clang++ usando clang++ , y está vinculada a libstdc++.so de libstdc++.so predeterminada en mi sistema. Mientras que la aplicación binaria fue -lc++ usando clang y vinculada con la opción -lc++ .

La forma más fácil de verificar dependencias es realizar ldd libName.so

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

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

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

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


Las respuestas aquí se centran principalmente en la forma corta de solucionarlo, pero si eso no ayuda, daré algunos pasos para verificar, eso me ayudó (solo Linux):

  • Si los errores del enlazador se producen al vincular otras bibliotecas, cree esas bibliotecas con símbolos de depuración (indicador GCC "-g")
  • Enumere los símbolos en la biblioteca y seleccione los símbolos de los que se queja el enlazador (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 no tiene no symbols , lo más probable es que elimine todos los símbolos de la biblioteca y es por eso que el enlazador no puede encontrarlos al vincular la biblioteca. Reconstruya la biblioteca sin eliminar TODOS los símbolos, puede eliminar los símbolos de depuración (opción opción strip -S ) si lo necesita.

  • Use un demandante 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 ahora sepa para solucionarlo

Obtuve esto, la única forma de solucionar esto fue actualizar todo mingw-64 (hice esto usando pacman en msys2 para su información).


Para mí -D_GLIBCXX_USE_CXX11_ABI = 0 no ayudó.

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


Si puede recompilar todas las bibliotecas incompatibles que usa, 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 del compilador del archivo MAKE de su proyecto

-D_GLIBCXX_USE_CXX11_ABI = 0

El define

#define _GLIBCXX_USE_CXX11_ABI 0/1

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