【问题标题】:MS vs Non-MS C++ compiler compatibilityMS 与非 MS C++ 编译器兼容性
【发布时间】:2011-08-19 09:28:11
【问题描述】:

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

【问题讨论】:

  • 有什么问题吗?您想知道一般差异吗?您打算将 msvc-dlls 与 mingw-libs 混合使用吗?
  • 90% 的可能性是这将揭示 您的 代码中的错误。偶然的 UB 类型。
  • @Andre,问题是做这样的事情有多可靠?我担心 MinGW 编译器的兼容性如何。
  • 两个答案都回答了所有问题 -- 将选择一个

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


【解决方案1】:

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

如果您考虑使用gcc 编译代码并让它调用Windows API,没关系,因为它是C;但是对于由 MSVC 生成的 C++ DLL,您可能会有一个刺耳的警钟。

主要问题是在 C++ 中,每个编译器都有自己的名称修饰(或更一般地说是 ABI)和自己的标准库。您不能混合使用两个不同的 ABI 或两个不同的标准库。故事结束。

Clang 具有特定的 MSVC 兼容模式,允许它接受 MSVC 接受的代码发出与使用 MSVC 编译的代码二进制兼容的代码。确实,甚至是officially supported in Visual Studio

显然,您也可以简单地在 C 中进行跨 DLL 通信来规避大多数问题。

编辑:Kerrek 的澄清。

【讨论】:

  • 澄清一下,“Windows API 和 Windows DLL”都使用纯 C 接口和 ABI,并且与 MingW/GCC 配合得很好。事实上,MingW 有一个 winapi 包,它为 Windows API DirectX(我认为是 8 和 9)提供了相当全面的支持。当然,MFC 是一个单独的问题,但至少就 Windows API 编程而言,MingW 值得一试。
  • @Kerrek:谢谢,我已经修改了文本以反映 Windows 提供的 ABI 和为 Windows 编译的 C++ 库之间的差异,因为它们是不同的野兽。
  • 知道了! MinGW-GCC 和 VC++ 不兼容 ABI。纯 C 接口保证可以工作。知道微软是否记录了它的 VC++ ABI 吗?感谢您的“clang”提示。
  • @Nick:我认为它有很好的文档记录,这就是 Clang 逐渐转向全面支持的方式。但是问题是结构化异常是我认为的专利,这会阻止 Clang 生成完全兼容的代码。
  • 我记得 mingw WINAPI 标头中缺少一些较新的 API,但我通过动态加载 dll 和“GetProcAddress-ing”来解决问题。
【解决方案2】:

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

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

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

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

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

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

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

 

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

【讨论】:

  • 有趣的信息,我在这里找到了更多关于 MinGW 和 DLL 的信息:mingw.org/wiki/MSVC_and_MinGW_DLLs
  • @Nick:一个简短的说明:您可能无法使用pexports。当我尝试使用它为其中一个 Windows DLL 生成DEF 时,它总是会崩溃(我不记得是哪个)。
  • 我刚刚在最近的 VC9 生成的 DLL 上尝试了pexports,它运行完美。无论如何感谢您的提示!
  • 如果 OP 将 C++ 替换为 C,答案会改变吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多