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 usandoclang++
. 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ánlibc++.so
-
Cree una biblioteca sin opciones adicionales y vincule el binario a
-lstdc++
. En este caso, tanto la biblioteca como la aplicación utilizaránlibstdc++.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ónstrip -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.