C++ C++;共享库导出功能
我想为一个应用程序写一个插件。应用程序带来了一个插件头文件和c文件,用导出的函数来填充。为了使开发更容易,我想创建一个C++“API”。 为此,我创建了带有虚拟函数(必需函数抽象)的基类,并从插件c文件中调用这些函数。 此“api”应位于静态库文件中 真正的插件(共享库)应该包括这个静态库,派生并实现它所需的类C++ C++;共享库导出功能,c++,static,shared,C++,Static,Shared,我想为一个应用程序写一个插件。应用程序带来了一个插件头文件和c文件,用导出的函数来填充。为了使开发更容易,我想创建一个C++“API”。 为此,我创建了带有虚拟函数(必需函数抽象)的基类,并从插件c文件中调用这些函数。 此“api”应位于静态库文件中 真正的插件(共享库)应该包括这个静态库,派生并实现它所需的类 现在我的问题是:如何从共享库中包含的静态库导出函数(因此应用程序从静态库调用函数)?这是可能的吗?通常,如果你想拥有一个带有C++的插件机制,那么这是最常用的方法: // Plugin
现在我的问题是:如何从共享库中包含的静态库导出函数(因此应用程序从静态库调用函数)?这是可能的吗?通常,如果你想拥有一个带有C++的插件机制,那么这是最常用的方法:
// Plugin file
extern "C" BaseClass* create()
{
return new DerivedClass;
}
extern "C" void destroy(BaseClass* base)
{
delete base;
}
然后,在使用插件的代码中,您实际上是在处理基类
,而不关心它当前指向的是哪个派生类
。因此,您需要从插件导出的方法应该放在基类中,并使它们成为虚拟的
注意1:确保始终调用destroy
函数,而不是主要使用delete
,因为它可能在应用程序中过载,但在插件库中不会过载,反之亦然
注意2:别忘了将基类的析构函数设置为虚拟的
< >强> NOTE3:使用动态加载库的C++ API时,应该非常小心。问题在于编译器会压缩C++类和函数名。因此,如果您碰巧使用不同的编译器或甚至使用同一编译器的不同版本编译应用程序和插件库,那么链接器可能无法正确解析函数名以在插件库中找到它
注4:如果您在应用程序中做了一些更改,从而使编译器更改现有函数的名称,则上述问题可能会发生。请查看有关此的更多信息