C++共享库导出功能
C++ shared library export function
我想为应用程序编写一个插件。该应用程序带来了一个插件头文件和c文件,该文件是用导出的函数编写的。为了使开发更容易,我想创建一个 c++ "api"。为此,我创建了带有虚函数的基类(必需函数抽象),并从插件 c 文件中调用此函数。此"api"应位于静态库文件中。
真正的插件(共享库)应该包含这个静态库,派生并实现它所需的类。
现在我的问题:如何从共享库中包含的静态库导出函数(因此应用程序从静态库调用函数)? 这可能吗?
通常,
如果您想使用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:不要忘记将基类的析构函数设为虚拟。
注意 3:将 API 与动态加载库一起使用时C++应该非常小心。问题是编译器破坏了C++类和函数名称。因此,如果您碰巧使用不同的编译器甚至同一编译器的不同版本编译应用程序和插件库,则链接器可能无法正确解析函数名称以在插件的库中找到它。
注意4:如果您在应用程序中进行一些更改,从而使编译器更改现有函数的名称重整,则可能会发生上述相同的问题。请在此处查看有关此内容的更多信息。
相关文章:
- 如何用共享库替换可执行C++程序的功能?
- 具有特定于枚举的实现和共享功能 (CRTP) 的类模板
- 我对C 中共享指针列表进行排序的功能未完成类型
- 共享_ptr中多功能数组的类型是什么
- 共享库中静态功能成员的破坏顺序
- 共享类时如何隐藏成员功能文件
- 为什么我的按钮类项目共享相同的lambda功能
- 您如何共享Java功能而不提供其他源代码
- 如何标识其功能当前正由可执行文件执行的共享库
- 在C 中使用DLSYM加载共享对象功能
- C 模板功能,相同类型,多个实例:共享一个相同的代码副本?即使在不同的CPP/对象文件中
- 应在共享库中避免静态成员功能
- 在多个类成员功能上共享模板参数
- 通过功能提升共享内存中的C++结构
- 在多个功能中共享随机引擎
- 共享库中的回溯功能
- C++共享库导出功能
- 可以两个类共享一个好友功能
- 任何可在facebook上共享/发送邮件的cocos2d-X功能
- 在C语言的不同功能中共享打开的文本文件