如何用C++在windows上制作一个二进制兼容的动态库

How to make a binary compatible dynamic library on windows with C++?

本文关键字:二进制 一个 动态 C++ 何用 windows      更新时间:2023-10-16

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

我知道你为什么要避免COM。我同意。所以剩下的一个选项实际上是dll的纯C接口。您确实需要注意坚持纯C链接(extern "C"声明)。

如果要为dll导出带有C++链接的类,编译器将需要为导出的符号生成损坏的名称。这些损坏的名称的生成取决于编译器版本。所以事实上,这意味着,您需要为所有支持的编译器版本部署dll。

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

需要记住的另一件事是,如果你计划在dll的接口中使用STL类型,你将面临更困难的时刻。有关更多详细信息,请参阅STL容器和二进制接口兼容性。

返回C接口

由于我们的团队面临着同样的问题,我们决定采用以下dll的设计:

  1. 。。。CCD_ 2接口和
  2. 。。。一个单独的立面

facadelib可以是在dll使用者的构建环境中编译的静态lib,也可以是仅头库。在任何一种情况下,它都是dll的脆性C接口的一个非常薄的包装器,并且可以提出一个更面向对象的设计。所以它至少可以做到:

  1. 将相关函数分组到类
  2. 将错误代码转换为异常
  3. 将STL类型(字符串、矢量等)转换为本地类型(const-char*、void*、bufferlength等)

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

相关文章: