MS与非MS C ++编译器兼容性

时间:2011-08-19 09:28:12

标签: c++ visual-c++ mingw

考虑在Windows上使用MinGW替代VC ++,但我担心兼容性问题。我在思考Windows上的行为,性能(MinGW编译EXE的任何机会都可能起作用)。此外,在调用Windows API,第三方DLL,普遍使用兼容的静态库以及将同一应用程序的部分与两个编译器混合时遇到的其他问题方面。

2 个答案:

答案 0 :(得分:9)

首先,MinGW不是编译器,而是环境,它与gcc捆绑在一起。

如果您考虑使用gcc来编译代码并让它调用Windows API,那就可以了,因为它是C;但对于MSVC生成的C ++ DLL,您可能会有一个严厉的唤醒呼叫。

主要问题是在C ++中,每个编译器都有自己的名称mangling(或更普遍的ABI)和它自己的标准库。您不能混合使用两个不同的ABI或两个不同的标准库。故事的结尾。

Clang试图尽可能地符合MSVC,但还没有。

  • 它成功地解析了MSVC标准库(2008和2010)以及MFC标题,但我不确定CodeGen方面。
  • 关于结构化例外存在ABI问题,我认为它与专利问题有关,因为它们无法纳入Clang,但可能是错误的。

因此,您必须选择一个C ++编译器并坚持下去。

显然,您也可以简单地在C中进行跨DLL通信以避免问题。

编辑:Kerrek的澄清。

答案 1 :(得分:4)

可以使用MinGW工具链编译为VC ++开发的大量C ++代码;但是,完成此任务的难易程度在很大程度上取决于C ++ - 符合标准的代码。

如果C ++代码使用VC ++扩展,例如__uuidof,那么您将需要重写这些部分。

你将无法编译ATL&使用MinGW的MFC代码因为ATL& MFC头使用许多VC ++扩展并依赖于VC ++特定的行为:

您将无法使用VC ++生成的LIB文件,因此您无法使用MinGW的链接器ld来链接静态库,而无需将库代码重新编译为MinGW {{ 1}}存档。

可以与闭源DLL链接;但是,您需要将export DLL的符号作为DEF fileuse dlltool来制作相应的A存档(类似于VC ++ A文件对于每个DLL)。

MinGW包含w32api项目基本上意味着使用Windows C API的代码编译得很好,尽管某些较新的功能可能无法立即使用。例如,几个月前我在编译使用某些“安全”函数(带有LIB后缀的函数)的代码时遇到了问题,但是我通过将DLL的符号导出为一个问题来解决这个问题。 _s,准备最新的DEF档案,并撰写前瞻性声明。

在某些情况下,您需要调整MinGW预处理器A的参数,以确保正确包含所有头文件并正确预定义某些宏。

我推荐的只是尝试它。您肯定会遇到问题,但您通常可以通过在互联网上搜索或询问某人来找到解决方案。如果没有其他原因,你应该尝试去了解更多关于C ++,编译器之间的差异以及符合标准的代码。

相关问题