es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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::operator

000cda80 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::operator

00080ead 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.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El >[abi:cxx11] en la salida del comando nm 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:

    namespace comm {
      struct InstanceID{
         .
         .
        __attribute__ ((visibility("default"))) operator std::__cxx11::basic_string<char,></char,><char>, std::allocator<char>> () const;
      }
    }
    

    Ten en cuenta que el tipo std::__cxx11::basic_string también debe especificarse con la etiqueta de ABI cxx11.

    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 nombres std::__cxx11, generalmente libstdc++. 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.

Comments are closed.