【问题标题】:C++ shared library export functionC++共享库导出函数
【发布时间】:2014-11-19 09:32:51
【问题描述】:

我想为应用程序编写一个插件。该应用程序带来了一个用导出函数编写的插件头文件和 c 文件来填充。为了使开发更容易,我想创建一个 c++“api”。 为此,我创建了带有虚函数(必需函数抽象)的基类,并从插件 c 文件中调用此函数。 这个“api”应该在一个静态库文件中。

真正的插件(共享库)应该包含这个静态库,派生并实现它需要的类。

现在我的问题:如何从共享库中包含的静态库中导出函数(以便应用程序从静态库中调用函数)?这可能吗?

【问题讨论】:

    标签: c++ static shared


    【解决方案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:不要忘记将基类的析构函数设为虚拟。

    注意 3: 在将 C++ API 与动态加载库一起使用时,您应该非常小心。问题是编译器会破坏 C++ 类和函数名。因此,如果您碰巧使用不同的编译器甚至使用同一编译器的不同版本编译您的应用程序和插件库,那么链接器可能无法正确解析函数名称以在插件库中找到它。

    注意 4: 如果您在应用程序中进行一些更改,从而使编译器更改现有函数的名称,则会发生上述相同的问题。请查看here 了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 2012-11-12
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 2018-02-12
      • 1970-01-01
      相关资源
      最近更新 更多