如何用C++在windows上制作一个二进制兼容的动态库
How to make a binary compatible dynamic library on windows with C++?
我制作了一个C++图形引擎,并希望将其分发到dll中。如何使dll与其他编译器兼容?我读过关于COM的文章,但这种方法不适合我,因为我不想依赖于windows标头。我知道的第二种方法是制作旧的C接口,但我正在计划一个面向对象风格的API,所以这种方法也是不真实的。在windows上的C++中还有其他方法可以做到这一点吗?
我知道你为什么要避免COM。我同意。所以剩下的一个选项实际上是dll的纯C接口。您确实需要注意坚持纯C链接(extern "C"
声明)。
如果要为dll导出带有C++链接的类,编译器将需要为导出的符号生成损坏的名称。这些损坏的名称的生成取决于编译器和版本。所以事实上,这意味着,您需要为所有支持的编译器版本部署dll。
名称篡改不是C++标准的一部分,因此编译器供应商之间不兼容,有时甚至同一供应商的编译器版本之间也不兼容。
需要记住的另一件事是,如果你计划在dll的接口中使用STL类型,你将面临更困难的时刻。有关更多详细信息,请参阅STL容器和二进制接口兼容性。
返回C接口
由于我们的团队面临着同样的问题,我们决定采用以下dll的设计:
- 。。。CCD_ 2接口和
- 。。。一个单独的立面库
facadelib可以是在dll使用者的构建环境中编译的静态lib,也可以是仅头库。在任何一种情况下,它都是dll的脆性C
接口的一个非常薄的包装器,并且可以提出一个更面向对象的设计。所以它至少可以做到:
- 将相关函数分组到类
- 将错误代码转换为异常
- 将STL类型(字符串、矢量等)转换为本地类型(const-char*、void*、bufferlength等)
通过这种方式,我们可以保持dll版本具有兼容接口的优势,并且无需(过多)照顾用户的环境。
相关文章:
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 在CRC-16 CCITT中将数据从二进制解码为文本,我应该输入一个码字,使用CRC生成器进行编码
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 如何在标准c ++中流式传输/读取二进制文件的中间部分并写入另一个文件?
- 如果你有一个固定大小的数组,你需要遍历它!n次,使用二进制搜索如何改变时间复杂性
- 是否可以在一个循环中写入多个二进制文件
- 使用无符号int作为二进制来在c++中实现一个集
- 程序错误地读取了二进制文件的一个字节
- 将文本和二进制数据连接到一个文件中
- 如何创建一个新的二进制文件并用常量值填充它?
- 无法一次从二进制文件中读取一个 int
- 我收到一个错误无效的操作数,类型为 const char [42] 和二进制"运算符+"的双倍数
- 在 NDK 上编译两个带有 gradle 的项目,其中一个依赖于另一个的二进制文件
- 我有一个预处理的 C/C++ 源文件 (cacti.i).如何从这个 .i 文件生成可执行二进制文件,以便我可以像 ./
- C++:如何在线程中读取二进制文件并将其写入另一个线程?
- 将结构编写为二进制,其中一个成员是字符串
- 将一个不充实的二进制搜索树转换为完整的二进制搜索树
- 将XSD文件嵌入一个(二进制文件)中
- 从一个二进制文件中读取信息,并写入另一个二进制文件
- 将 tesseract 编译/捆绑为一个二进制文件