如何使用C ++在Windows上制作二进制兼容的动态库?

时间:2019-02-01 16:12:28

标签: c++ abi

我制作了一个C ++图形引擎,我想将其分发到dll中。如何使dll与其他编译器兼容?我了解了COM,但是这种方法不适合我,因为我不想依赖Windows标头。我知道的第二种方法-制作旧的C接口,但是我正在规划面向对象风格的API,因此这种方法也不是真实的。在Windows上的C ++中还有其他方法可以做到这一点吗?

1 个答案:

答案 0 :(得分:2)

我知道您为什么要避免使用COM。我同意。因此,剩下的一个选项实际上是您的dll的纯C接口。而且,您确实需要注意保持纯C链接(extern "C"声明)。

如果要为您的dll导出具有C ++链接的类,则编译器将需要为导出的符号生成混杂名称。这些混杂名称的生成取决于编译器版本。因此,实际上,这意味着您需要为所有受支持的编译器版本部署dll。

名称修饰不是C ++标准的一部分,因此在编译器供应商之间甚至有时在同一供应商的编译器版本之间都是不兼容的。

要记住的另一件事是,如果您打算在dll的界面中使用STL类型,您将面临更加困难的时期。有关更多详细信息,请参见STL Containers and Binary Interface Compatibility

返回C界面

当我们在团队中面临相同的问题时,我们决定设计一种具有以下功能的dll:

  1. ...一个C界面和
  2. ...随附一个单独的 facade

facade 库可以是在dll消费者的构建环境中编译的静态库,也可以是仅标头的库。无论哪种情况,它都是DLL脆弱的C接口周围的非常薄的包装,可以转发更面向对象的设计。因此,至少要做的是:

  1. 将与类相关的功能分组。
  2. 将错误代码转换为异常。
  3. 将STL类型(字符串,向量等)转换为本地类型(const char *,void *,bufferlength等)

通过这种方式,我们可以保持具有兼容接口的dll版本的优势,而无需过多地照顾用户的环境。