不同编译器的DLL兼容性

时间:2015-07-10 07:34:42

标签: c++ dll

尽量不要对这个问题判断我。

如果我尝试在使用MinGW工具链(g ++)编译的Visual Studio项目中使用DLL(用C ++编写),我会遇到问题吗?

如果答案是肯定的,有人可以解释一下原因吗?

3 个答案:

答案 0 :(得分:4)

就代码执行而言,如果它以Windows为目标,那么它应该运行。

互操作性;它取决于从dll中公开的API。

  • 如果它是“C”风格的API那么你应该没问题。
  • 如果它是使用类和STL的C ++ API,那么使用不同的编译器(甚至编译器中的不同设置)可能会遇到麻烦。 C ++没有标准的ABI。

正如评论中所述,可能值得一提; “C”风格的API不仅仅是函数调用,兼容性包括(但不限于)诸如此类的东西;

  • 内存分配;一般规则是“解除分配必须通过与分配相同的代码” - 即在dll中使用匹配的分配/解除分配(例如newdeletemallocfreeCustomAllocCustomDealloc
  • 数据对齐和打包,并非所有编译器都具有相同的默认值
  • 再次调用约定,并非所有编译器都具有相同的默认值,如有疑问,请明确说明该约定应该是什么(例如__stdcall

对于C ++ ABI,除上述所有内容外,不兼容性还包括;

  • 名称修改
  • STL类和容器实现
  • newdelete的单独和不同实现,以及自定义内存池等。
  • 例外机制,例如生成和堆栈展开

这些不是全面的列表,但是它们可以在某种程度上激发的一般建议,使用相同的工具链和相同的编译器/链接器设置

答案 1 :(得分:0)

问题不在于DLL。它是关于如何向编译器描述这样的DLL(即头文件和导出)。

这些描述会影响您的代码在数据布局上的期望(例如,不同的编译器可能具有不同的默认对齐和填充),甚至不同的代码路径(例如,解析为不同的内联函数和宏,例如在STL情况下)。

然后每个编译器可能有不同的名称修改方案,你可能需要一点点破解来粘合代码。

对上述问题非常谨慎,使用不同编译器的DLL应该没问题。

答案 2 :(得分:-3)

不,因为它是一个标准。事实上,使用gcc编译的C ++应用程序从OS dll文件调用系统函数。所以不管你是手动还是自动打电话,都是一样的。