utilizar utilidad tipos studio programacion importar como bibliotecas biblioteca c module dlopen

utilidad - tipos de bibliotecas en flash



¿Cómo llamaría una función de biblioteca cargada a un símbolo en la aplicación principal? (3)

La función dlopen() , tal como se describe en @litb, se proporciona principalmente en sistemas que utilizan archivos de objetos de formato ELF. Es bastante potente y le permitirá controlar si los símbolos a los que hace referencia la biblioteca cargada se pueden satisfacer desde el programa principal y, en general, permite que se satisfagan. No todos los sistemas de carga de bibliotecas compartidas son tan flexibles, tenga en cuenta si se trata de portar su código.

El mecanismo de devolución de llamada descrito por @hhafez funciona ahora que las fallas en ese código están enderezadas.

Cuando se carga una biblioteca compartida se abre a través de la función dlopen() , ¿hay alguna manera de llamar funciones en el programa principal?


Sí, si proporciona a su biblioteca un puntero a esa función, estoy seguro de que la biblioteca podrá ejecutar / ejecutar la función en el programa principal.

Aquí hay un ejemplo, no lo compilé, así que ten cuidado;)

/* in main app */ /* define your function */ int do_it( char arg1, char arg2); int do_it( char arg1, char arg2){ /* do it! */ return 1; } /* some where else in main app (init maybe?) provide the pointer */ LIB_set_do_it(&do_it); /** END MAIN CODE ***/ /* in LIBRARY */ int (*LIB_do_it_ptr)(char, char) = NULL; void LIB_set_do_it( int (*do_it_ptr)(char, char) ){ LIB_do_it_ptr = do_it_ptr; } int LIB_do_it(){ char arg1, arg2; /* do something to the args ... ... */ return LIB_do_it_ptr( arg1, arg2); }


Código de dlo.c (la lib):

#include <stdio.h> // function is defined in main program void callb(void); void test(void) { printf("here, in lib/n"); callb(); }

Compilar con

gcc -shared -olibdlo.so dlo.c

Aquí el código del programa principal (copiado de la página de manual de Dlopen, y ajustado):

#include <stdio.h> #include <stdlib.h> #include <dlfcn.h> void callb(void) { printf("here, i''m back/n"); } int main(int argc, char **argv) { void *handle; void (*test)(void); char *error; handle = dlopen("libdlo.so", RTLD_LAZY); if (!handle) { fprintf(stderr, "%s/n", dlerror()); exit(EXIT_FAILURE); } dlerror(); /* Clear any existing error */ *(void **) (&test) = dlsym(handle, "test"); if ((error = dlerror()) != NULL) { fprintf(stderr, "%s/n", error); exit(EXIT_FAILURE); } (*test)(); dlclose(handle); exit(EXIT_SUCCESS); }

Construir con

gcc -ldl -rdynamic main.c

Salida:

[js@HOST2 dlopen]$ LD_LIBRARY_PATH=. ./a.out here, in lib here, i''m back [js@HOST2 dlopen]$

La opción -rdynamic pone todos los símbolos en la tabla de símbolos dinámicos (que está mapeada en la memoria), no solo los nombres de los símbolos usados. Lea más sobre esto aquí . Por supuesto, también puede proporcionar punteros a funciones (o una estructura de indicadores de función) que definan la interfaz entre la biblioteca y su programa principal. En realidad, es el método que elegiría probablemente. Escuché de otras personas que no es tan fácil de hacer: -rdynamic en las ventanas, y también haría una comunicación más -rdynamic entre la biblioteca y el programa principal (tienes un control preciso de lo que se puede llamar y no), pero también requiere más mantenimiento de la casa.