Entendiendo las aplicaciones con módulos.

Muy buenas,

Como es lógico, para nosotros también febrero(la mitad) es uno de los meses con menos carga de trabajo de la universidad por lo que podemos dedicarle un poco mas de tiempo a nuestro querido proyecto.

Tras el ultimo articulo sobre libtool, automake y autoconf, hemos conseguido compilar un proyecto con una libreria completamente estatica y otra con carga dinamica, y lo mejor es que lo hemos podido realizar tanto en windows como en linux. Este miniarticulo trata sobre la carga de modulos.

Como ya teniamos claro para la carga de modulos en c++ hay una cosa muy importante que no pone en muchos manuales y es que un modulo debe de tener un Interfaz y ese interfaz debe de estar compilado y adjuntado como libreria, de tal manera que al cargar el modulo los objetos tengan definidas las cabeceras adecuadas. Esto es, NO vale con añadir el .h y decir carga modulo pues nos dará una cantidad de errores Undefined reference proporcional al numero de lineas con llamadas a objetos . Tampoco vale cargar el .h y hacer casting a la clase Modulo(suponiendo esta clase como la clase que usas hija). Lo que hay que hacer es:

1) Incluir el .h
2) Incluir en el Makefile.am la linea donde está el fichero Interfaz (ojo! la clase padre a la clase Modulo)
3) Usar el polimorfismo para cargar el módulo y usar los metodos de la INTERFAZ para acceder al Modulo. Solo tendremos acceso a esos metodos, si quieres mas metodos debes de añadirlos a la interfaz.

Es importante definir que entendemos por Interfaz. Una interfaz es una clase C++ virtual de la que hereda una clase que usa esa interfaz y que implementa los metodos virtuales que no han sido creados en la clase padre.

Si no se hace asi entonces te tocará hacer una compilacion "estatica", o una dinamica pero con enlazado en tiempo de compilación, lo que hace que todo tenga menos forma de plug-ins.

Si teneis dudas no dudeis en preguntar que espero poder contestar lo mas rapido posible.

Muchas gracias,
Joan