GNU/Linux >> Tutoriales Linux >  >> Linux

Compilación de biblioteca compartida dinámica con g ++

dlsym devuelve un puntero al símbolo. (Como void* para ser genérico.) En su caso, debe convertirlo en un puntero de función.

 double (*mycosine)(double); // declare function pointer
 mycosine = (double (*)(double)) dlsym(handle, "cos"); // cast to function pointer and assign

 double one = mycosine(0.0); // cos(0)

Así que este es uno de estos raros casos en los que el error del compilador es una buena pista.;)


C permite conversiones implícitas desde void * a cualquier tipo de puntero (incluidos los punteros de función); C++ requiere conversión explícita. Como dice leiflundgren, debe emitir el valor de retorno de dlsym() al tipo de puntero de función que necesita.

Mucha gente encuentra incómoda la sintaxis del puntero de función de C. Un patrón común es tipear el puntero de función:

typedef double (*cosine_func_ptr)(double);

Puede definir su variable de puntero de función cosine como miembro de tu tipo:

cosine_func_ptr cosine;

Y emita usando el tipo en lugar de la incómoda sintaxis del puntero de función:

cosine = (cosine_func_ptr)dlsym(handle, "cos");

Linux
  1. Introducción a las bibliotecas compartidas de Linux (Cómo crear bibliotecas compartidas)

  2. Biblioteca compartida dinámica de C++ en Linux

  3. ¿Convertir una biblioteca estática en una biblioteca compartida?

  4. Enlace estático de función de biblioteca compartida en gcc

  5. Cómo usar la memoria compartida con Linux en C

Detecte bibliotecas compartidas obsoletas en la memoria con UChecker

Bash Scripting - Funciones explicadas con ejemplos

¿Usando SDL2 en Linux con g ++?

Obtener nombres de funciones en una biblioteca compartida mediante programación

Error al cargar la biblioteca compartida (glow)

Enlace dinámico - Linux vs. ventanas