Я реализовал очень простую «систему плагинов» как часть статической библиотеки . Каждый «плагин» реализует поддержку определенного формата изображения, например, GIF, JPEG и т. Д. Кроме того, у меня есть Singleton (класс с именем PluginManager
), который хранит список всех доступных плагинов.
Сложность в том, что я хочу отключить / включить плагины, добавляя или удаляя их исходные файлы из файла проекта. Для этого каждый плагин создает глобальную переменную (с разными именами) и регистрирует плагин в конструкторе этого класса на PluginManager
.
Примерно так в формате JPEG ...
struct JPEGPlugin
{
// constructor will register plugin
JPEGPlugin()
{
PluginManager::Singleton().RegisterPlugin(this);
}
// plenty of other code
...
};
JPEGPlugin jpeg_instance; // instantiate in global scope
Однако, хотя теоретически это работает идеально, при подключении этой статической библиотеки к другому коду для создания исполняемого файла происходит сбой. Пока этот исполняемый файл не имеет доступа к глобальным переменным плагина (например, jpeg_instance
), компоновщик не видит соединения (он полностью игнорирует побочные эффекты конструктора) и не включает код в конечный исполняемый файл. Другими словами, плагин JPEG недоступен в финальном приложении.
Я сталкивался с проблемами пару раз за эти годы, и я всегда искал в сети решения. Каждый раз я просто находил страницы, на которых в основном говорится, что это известная проблема, и что я должен с этим смириться.
Но, может быть, кто-то на SO знает, как заставить это работать?