c++ - 从另一个编译器导出的 DLL 加载类

标签 c++ class dll compiler-construction export

如果我们计划使用来自不同编译器的 DLL,我必须向我的团队解释为什么从 DLL 导出类不是好的解决方案。但我找不到证明。标准中是否有类似“编译器不应该提供向后兼容性,不同的编译器也可以实现自己的命名导出符号样式,因此从 DLL 导出的类只能由同一个编译器使用”之类的东西? 我知道这是真的,但我怎么证明呢?另外,如果您知道我的其他论据,请帮忙!

最佳答案

这里有一些您可能会觉得有趣/有用的要点,可以告诉您的团队。

  • 不同的编译器以不同的方式处理 C++ 名称。使用显式 .def 文件可以规避这个简单的名称重整问题。

  • 不同的结构对齐问题需要正确的编译器选项(-mms-bitfields,...)。

  • 底层异常和内存模型的根本冲突:

    • MSVC DLL 中的 new/delete 或 malloc/free 不会与 Cygwin newlib new/delete 或 malloc/free 协作。根本无法释放在使用不同的 new/malloc 的函数中分配的空间。

    • Cygwin 可执行文件不会捕获 MSVC DLL 引发的异常,反之亦然。

    • 缓慢的 GNU SJLJ 异常模型(在 GCC-3.x 和更早版本中使用)与 MSVC++ 模型兼容,但新的 DWARF2 模型(将由 GCC-4.x 使用) , 将不兼容。

给出更完整的解释here ,从那里我无耻地复制了上面的内容。看到你使用 MinGW,这应该是非常相关的。

此外,如果您还没有这样做,请查看关于 this SO question 的讨论。 .

关于c++ - 从另一个编译器导出的 DLL 加载类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24495392/

相关文章:

java - jni 程序中 dll 的保存位置

c++ - `time` 基准测试实用程序 : What does `user` + `sys` = 0 actually mean?

c++ - Qt 右键单击​​ QListWidget 打开上下文菜单并删除项目

c++ - 在 C++ 中将整数写入 .txt 文件

php - 有没有办法在 PHP 中查询 JSON?

Android 传递值给类

c++ - ActiveSync 库

c++ - C++中如何让类的成员函数每次调用时生成不同的随机数?

c++ - 从 DllMain 或全局初始值设定项调用 C++ 运行时

c++ - 如何在 Visual Studio 2005 中创建 ATL/C++ ActiveX DLL