gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:24:37 29 4
gpt4 key购买 nike

我制作了一个 C++ 图形引擎,我想在 dll 中分发它。如何使 dll 与其他编译器兼容?我阅读了有关 COM 的信息,但这种方法不适合我,因为我不想依赖 Windows header 。我知道的第二种方法 - 创建旧的 C 接口(interface),但我正在计划面向对象风格的 API,所以这种方法也不是真实的。在 Windows 上的 C++ 中还有其他方法可以做到这一点吗?

最佳答案

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

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

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

要记住的另一件事是,如果您计划在 dll 的接口(interface)中使用 STL 类型,您将面临更艰难的时期。请看STL Containers and Binary Interface Compatibility了解更多详情。

回到C界面

由于我们在团队中面临同样的问题,我们决定设计一个 dll 具有:

  1. ... C 接口(interface)和
  2. ...一个单独的外观

facade 库可以是在 dll 消费者的构建环境中编译的静态库,也可以是仅包含头文件的库。在任何一种情况下,它都是围绕 dll 脆弱的 C 接口(interface)的非常薄的包装器,并且可以转发更面向对象的设计。所以至少要做的是:

  1. 将相关函数分组到类中。
  2. 将错误代码转换为异常。
  3. 将 STL 类型(字符串、 vector 等)转换为原生类型(const char*、void*、bufferlength 等)

这样我们就可以保持 dll 版本具有兼容接口(interface)的优势,而无需(太)关心用户的环境。

关于c++ - 如何使用 C++ 在 Windows 上制作一个二进制兼容的动态库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54483185/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com