C++共享库导出功能

C++ shared library export function

本文关键字:功能 共享 C++      更新时间:2023-10-16

我想为应用程序编写一个插件。该应用程序带来了一个插件头文件和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:如果您在应用程序中进行一些更改,从而使编译器更改现有函数的名称重整,则可能会发生上述相同的问题。请在此处查看有关此内容的更多信息。