【发布时间】:2021-03-29 14:46:29
【问题描述】:
我想编写一个可以用作插件的库。该库是用 C++ 编写的,也应该在 C++ 代码中使用。我找到了this article,它描述了如何通过用户可见的纯虚拟接口结构导出 c++ 类。简而言之,代码如下:
struct VirtualInterface
{
virtual MyExportedFunction() = 0;
}
class MyInterfaceImplementer : public VirtualInterface
{
...
virtual MyExportedFunction(){...}
...
}
extern "C" MyAPI VirtualInterface* Factory(); // The only exported function
文章作者曾说过:
无法有效支持 COM 的假设 C++ 编译器是 注定在Windows市场被遗忘。这就是为什么,如今, 通过抽象接口从 DLL 公开 C++ 类将起作用 可靠地与 Windows 平台上的每个体面的 C++ 编译器一起使用。
我是否理解这种导出 C++ 类的方式依赖于编译器实现并且不能保证按标准工作?如果是的话,除了通过创建一个导出接口的每一个函数的 C 接口之外,是否有一种可移植的方式?
【问题讨论】:
-
是的,C++ 没有标准的 ABI,因此对于健壮的应用程序,通常建议创建一个纯 C 包装器。该包装器还可以在边界处停止所有异常并将它们转换为老式 C 返回代码 - 原始但健壮。
-
@ErikAlapää 我的插件需要在 UNIX 系统上运行。所以听起来好像我必须忍受 C 出口。谢谢。
-
@PaulR。这一点意味着您可以将纯基于接口的库与任何 COM 友好的编译器一起使用。您还可以导出没有接口的类。在这种情况下,您必须保证库和用户模块都是使用相同的编译器和链接器构建的,具有相似的选项(例如调试或发布)。
-
该标准没有提及 DLL 或共享库或可加载插件。实际上,您所描述的内容仅适用于所有常见平台。如果您只针对 C++ 用户,并且愿意假设他们将使用与您相同的 C++ 编译器,则无需诉诸 C 或 COM 或其他类似的废话。
标签: c++ shared-libraries language-lawyer