¿Cómo vincular a una función con [abi:cxx11] definida en una biblioteca compartida?
Estoy espiando una biblioteca compartida utilizando la herramienta “nm”. Tengo dos versiones de esta biblioteca, y en cada una de ellas, tengo una definición para una conversión de tipo sobrecargada, específicamente:
Versión 1
FrEspinosa@computerLinux:~frameworkPath1/lib
$ nm -D libcomm.so | c++filt | grep comm::InstanceID::operator000cda80 T comm::InstanceID::operator std::_cxx11::basic_string<char,></char,>
, std::allocator () const
Versión 2
FrEspinosa@computerLinux:~frameworkPath2/lib
$ nm -D libcomm.so | c++filt | grep comm::InstanceID::operator00080ead T comm::InstanceID::operator std::_cxx11::basic_string<char,></char,>
, std::allocator >abi:cxx11 const
¿Qué es esto “[abi:cxx11]”, y cómo debería lucir la firma/declaración de mi función en mi archivo de encabezado para que coincida con la versión 2? ¿Necesito una bandera de compilador especial o enlazar una biblioteca especial?
Como referencia, la función que se enlaza con éxito en la versión 1 se ve así:
namespace comm {
struct InstanceID {
.
.
__attribute__ ((visibility("default"))) operator ipl::string () const;
}
}
EDIT:
Como referencia adicional, el compilador/enlazador que estoy utilizando es:
arm-poky-linux-gnueabi-gcc (GCC) 8.2.0
Y la biblioteca fue compilada con GNU 6.2.0
FrEspinosa@computerLinux:~/frameworkPath2/lib $ strings -a libcomm.so | grep -i gcc
libgcc_s.so.1 GCC 3.5 GCC: (GNU) 6.2.0
compilerPath/usr/lib/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/6.2.0/include
Así que estoy usando un compilador más nuevo.
davy.ai
El
>[abi:cxx11]
en la salida del comandonm
se refiere a la etiqueta del Interfaz Binario de Aplicaciones (ABI, por sus siglas en inglés)cxx11
, indicando que la función utiliza la ABI de C++11, la cual es diferente a la ABI anterior de C++98. Esto generalmente ocurre cuando los objetos o funciones utilizan características del lenguaje C++11 que son incompatibles con la ABI anterior.Para que coincida la firma de la función en la versión 2 de la biblioteca, el archivo de encabezado debería declarar el operador de conversión sobrecargado con la misma etiqueta de ABI de C++11, de la siguiente manera:
Ten en cuenta que el tipo
std::__cxx11::basic_string
también debe especificarse con la etiqueta de ABIcxx11
.En cuanto a las opciones del compilador o bibliotecas, es posible que necesites usar la opción
-std=c++11
para habilitar las características de C++11, así como vincular con la biblioteca que proporciona el espacio de nombresstd::__cxx11
, generalmentelibstdc++
. Sin embargo, dado que estás utilizando un compilador más nuevo que el utilizado para construir la biblioteca, puede haber problemas de versiones que podrían causar errores en tiempo de ejecución, especialmente si la biblioteca depende de otras bibliotecas construidas con el compilador antiguo. En ese caso, es posible que necesites reconstruir la biblioteca con el compilador más nuevo para asegurar la compatibilidad.