我想为应用程序编写一个插件。该应用程序带有一个插件头文件和c文件,用导出的函数填充。为了使开发更容易,我想创建一个c ++" api"。 为此,我使用虚函数创建了基类(必需的函数抽象),并从插件c文件中调用此函数。 这个" api"应该在静态库文件中。
真正的插件(共享库)应该包含这个静态库,派生并实现它所需的类。
现在我的问题:如何从共享库中包含的静态库导出函数(因此应用程序从静态库中调用函数)?这有可能吗?
答案 0 :(得分:1)
通常如果你想拥有一个带C ++的插件机制,那么这是最常用的方法:
// Plugin file
extern "C" BaseClass* create()
{
return new DerivedClass;
}
extern "C" void destroy(BaseClass* base)
{
delete base;
}
然后在使用插件的代码中,您实际上正在处理BaseClass
,而不关心它当前指向的DerivedClass
。因此,您需要从插件中导出的方法应放在BaseClass
中并使其成为虚拟。
注1:请确保始终使用destroy
函数而不是主要使用delete
,因为它可能会在您的应用程序中重载但不会在插件库中重载,反之亦然
注2:不要忘记将基类的析构函数设为虚拟。
Note3:在将C ++ API与动态加载库结合使用时应该非常小心。问题是编译器破坏了C ++类和函数名。因此,如果您碰巧使用不同的编译器或甚至使用相同编译器的不同版本编译您的应用程序和插件库,那么链接器可能无法正确解析函数名称以在插件库中找到它。
Note4:如果在应用程序中进行一些更改,可能会发生上述同样的问题,从而使编译器更改现有函数的名称。有关详细信息,请查看here。