2009-04-24 15 views
11

Al desarrollar un marco basado en el complemento C/C++ (= 2?) Con objetos compartidos/bibliotecas dinámicas que necesitan admitir el intercambio en vivo, ¿qué ejemplos serían útiles para los detalles de implementación?¿Buenos patrones para un sistema basado en complementos C/C++?

Gracias.

Nota: intercambio directo es el punto clave en este caso, no es necesario reiniciar el sistema es un requisito

+0

¿Puede explicar el sistema operativo? –

+0

Ver http://stackoverflow.com/questions/384121/creating-a-module-system-dynamic-loading-in-c como punto de partida. – unwind

+0

Para Windows/otro sistema operativo? – RobS

Respuesta

9

Si usted está en POSIX, dlopen(), dlsym() y dlclose() es todo lo que necesita.

Consulte man dlsym para obtener detalles y ejemplos.

Hay un buen article sobre la carga de bibliotecas dinámicas, y la infraestructura de complementos es un ejemplo.

EDIT OP agregó Windows como requisito por lo que este enfoque no ayudará ya que Windows no es compatible con POSIX. Sin embargo, hay funciones similares en WinAPI, ver here.

+0

Aunque sea posible, recomendaría utilizar una biblioteca independiente de plataforma como ACE http://www.dre.vanderbilt.edu/Doxygen/Current/html/ace/a00110.html – lothar

5

Es posible que desee probar Boost.Extension pero tenga cuidado: a pesar de su nombre, no es una de las bibliotecas de impulso.

Aquí hay un link to its documentation.

+0

very niceits no boost (aún) pero está en la caja de arena –

2

Para los complementos de C++ puede consultar this article que detallan cómo lograrlo con las llamadas posix mencionadas anteriormente.

Citando el artículo:

Teniendo en cuenta que podemos utilizar estas funciones para acceder a las funciones en una biblioteca C, ¿cómo los utilizamos para las clases de acceso en una biblioteca de C++? Hay varios problemas para superar. Una es que debemos ser capaces de localizar los símbolos que necesitamos en la biblioteca. Esto es más complicado de lo que parece debido a la diferencia entre la forma en que se almacenan los símbolos en los archivos C y C++.

4

Si desea cargar la biblioteca multiplataforma sin tener que desarrollar para cada API de plataforma individualmente, libltdl puede ayudar.

Libtool proporciona una pequeña biblioteca, llamada libltdl, que tiene como objetivo ocultar las diversas dificultades de bibliotecas de dlopening de los programadores. Consiste en unos pocos encabezados y pequeños archivos de código fuente en C que se pueden distribuir con aplicaciones que necesitan funcionalidad de dlopening. En algunas plataformas, cuyos enlazadores dinámicos son demasiado limitados para una implementación simple de los servicios libltdl, requiere GNU DLD, o solo emulará la vinculación dinámica con el mecanismo dlpreopening de libtool.

libltdl actualmente soporta los siguientes mecanismos de enlace dinámicos:

  • dlopen (Solaris, Linux y varios sabores de BSD)
  • shl_load (HP-UX)
  • LoadLibrary (Win16 y Win32)
  • load_add_on (BeOS)
  • NSAddImage o NSLinkModule (Darwin y Mac OS X)
  • GNU sistema antibloqueo de frenos (emula el enlace dinámico para las bibliotecas estáticas)
  • dlpreopen de libtool (ver ver Dlpreopening)

Boost.Extension parece apoyar sólo Windows PE dll s, UNIX ELF objetos compartidos, y Mac Paquetes OS X Mach-O. Bueno, eso puede ser suficiente para usted ...

Cuestiones relacionadas