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

Nic*_*ick 4 c++ mingw visual-c++

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

Mat*_* M. 10

首先,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的澄清.

  • 只是为了澄清,"Windows API和Windows DLL"都使用纯C接口和ABI,并且与MingW/GCC配合得很好.实际上,MingW有一个winapi包,它为Windows API*和*DirectX提供了相当全面的支持(我认为是8和9).当然,MFC是一个单独的问题,但至少就Windows API编程而言,MingW值得一试. (3认同)

Dan*_*ien 5

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

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

您将无法使用 MinGW 编译 ATL 和 MFC 代码,因为 ATL 和 MFC 标头利用了许多 VC++ 扩展并依赖于 VC++ 特定的行为:

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

可以链接闭源 DLL;但是,您需要将 DLL 的符号导出DEF文件用于dlltool制作相应的A存档(类似于LIB每个 DLL的 VC++文件)。

MinGW 包含 w32api 项目基本上意味着使用 Windows C API 的代码可以很好地编译,尽管一些较新的函数可能不会立即可用。例如,几个月前,我遇到了麻烦,在编译使用一些“安全”功能(那些与代码_s后缀),但我得到了解决此问题通过导出DLL作为的象征DEF,准备一个向上最新A存档,并编写前向声明。

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

 

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