如果我们计划使用来自不同编译器的 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/