我已经实现了一个非常基本的“插件系统”作为静态库的一部分。每个“插件”都实现了对特定图像格式的支持,例如 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 上的某个人知道如何使它工作?