Implementé un "sistema de plugins" muy básico como parte de una biblioteca estática . Cada "complemento" implementa el soporte para un formato de imagen específico, p. GIF, JPEG, etc. Además, tengo un Singleton (una clase llamada PluginManager
) que mantiene una lista de todos los complementos disponibles.Registro de objetos en la biblioteca estática
La parte complicada es que quiero deshabilitar/habilitar los complementos al agregar o eliminar sus archivos fuente del archivo de proyecto. Para lograr esto, cada plugin crea una variable global (con diferentes nombres) y registra el plugin en el constructor de esa clase en PluginManager
.
Algo como esto para el formato JPEG ...
struct JPEGPlugin
{
// constructor will register plugin
JPEGPlugin()
{
PluginManager::Singleton().RegisterPlugin(this);
}
// plenty of other code
...
};
JPEGPlugin jpeg_instance; // instantiate in global scope
Sin embargo, aunque esto funciona perfectamente en teoría, se produce un error al vincular esta biblioteca estática a otro código para construir un ejecutable. Mientras este ejecutable no acceda a los plugins globales (como jpeg_instance
), el enlazador no ve una conexión (ignora por completo los efectos secundarios del constructor) y no incluye el código en el ejecutable final. En otras palabras, el complemento JPEG no está disponible en la aplicación final.
Me encontré con los problemas un par de veces en los últimos años, y siempre busqué soluciones en la red. Cada vez, acabo de encontrar páginas que básicamente dicen que es un problema conocido y que tengo que vivir con eso.
Pero tal vez alguien en SO sabe cómo hacer que esto funcione?
OK, acabo de notar su edición, ¡ese es un gran punto! :) –