los sistemas de plugin que conozco del todo el uso de las bibliotecas dinámicas. Básicamente, debe definir un pequeño y efectivo saludo de manos entre el kernel del sistema y los complementos. Como no hay C++ ABI, los complementos solo deben usar una API C o usar el mismo compilador (y probablemente la versión del compilador) como kernel del sistema.
El protocolo pensable más simple sería una función que todos los desarrolladores de complementos tendrían que proporcionar, que devuelve una instancia de una clase derivada de su clase base, devuelta como un puntero de clase base. (El extern "C"
se asegura de que la función no tendrá un nombre revuelto, y por lo tanto es más fácil de encontrar por su nombre.) Algo así como:
extern "C" {
plugin_base* get_plugin();
}
El núcleo entonces intentará cargar archivos binarios que se encuentran en los lugares designados como dinámico bibliotecas e intento de encontrar la función get_plugin()
. Si tiene éxito, llama a esta función y termina con una instancia de complemento cargada.
Por supuesto, sería bueno tener también funciones para verificar la versión de la API compilada contra la versión del kernel. (Después de todo, puede cambiar esa clase base). Y puede que tenga otras funciones, que devuelven información sobre el complemento (o lo tiene como virtuales en la clase base). Eso depende mucho de la naturaleza de su sistema.
Si plugin_base no es POD pero es una clase que hereda de la clase de plugin base, creo que para que todo funcione algún tipo de C++ ABI (el definido por el compilador que utilizó) tendría que ser utilizado.: S –
@Matteo: Sí, tienes un punto muy válido allí. Gracias. Adapte mi respuesta en consecuencia. – sbi
No hay problema. :) Por cierto, una alternativa en Windows sería usar COM, que en realidad se puede ver parcialmente como un C++ ABI compatible con otros lenguajes. –