Tengo una aplicación a la que uso bibliotecas compartidas. Estas bibliotecas están vinculadas en tiempo de compilación.
En tiempo de ejecución, el cargador espera que el objeto compartido esté en el LD_LIBRARY_PATH
; si no se encuentra, la aplicación falla con el error "no se pueden cargar bibliotecas compartidas". Tenga en cuenta que no hay garantía de que el cliente tenga la biblioteca. caso, quiero que la aplicación deje un mensaje de error adecuado, también la parte independiente debería funcionar correctamente.Alternativas a dlsym() y dlopen() en C++
Para este propósito estoy usando dlsym()
y dlopen()
para usar la API en la biblioteca compartida. El problema con esto es que si tengo muchas funciones en la API, tengo que acceder a ellas individualmente usando dlsym()
y ptrs que en mi caso conducen a daños en la memoria y fallas del código.
¿Hay alguna alternativa para esto?
y cómo llamo a dlopen() para obtener el foo_handle? Quiero decir, ¿cargará el objeto compartido de la API, digamos libAPI.so automáticamente? – sud03r
Es dlopen() en realidad para abrir la biblioteca ... :) .. de todos modos tengo tu punto ... pero esto funciona solo si hay una estructura de API en la biblioteca ... que no puedes esperar con un tercero biblioteca ... Estoy tratando de utilizar sungrid api libdrmaa.so .. – sud03r
En lugar de obtener un puntero a una tabla, en su lugar podría obtener un puntero a una función que cuando se llama devuelve el puntero a la tabla. Esto permite que el complemento se inicialice antes de llamar a cualquier otra función, e incluso crea la tabla de forma dinámica. – CesarB