在 Mingw 上编译的 C/C++ 代码能否保证与 GCC 完全兼容(在 linux 和 Mac 上)

Posted

技术标签:

【中文标题】在 Mingw 上编译的 C/C++ 代码能否保证与 GCC 完全兼容(在 linux 和 Mac 上)【英文标题】:Would C/C++ code compiling on Mingw guarantee full compatibility with GCC(on linux and Mac) 【发布时间】:2010-11-02 20:41:40 【问题描述】:

我想生成与交叉编译器兼容的 C++ 代码。 我编写了一个有点“异国情调”的代码,它将 C++ 语言推向了灰色、怪异、神秘的领域。

考虑到我的代码只依赖于 boost 和 STL,问题在于检查代码兼容性,而不是 lib 兼容性:

我的代码同时编译 msvc 和 Mingw 是否能确保我的代码 100% 与每个平台上的 GCC 兼容?

【问题讨论】:

“每个平台”是什么意思?存在很多很多平台,甚至更多过时的平台。您应该针对它们中的一个子集并在那里进行测试。只有这样,您才能确定您的代码与 closs 平台兼容。 “平台”是指“目标处理器”。我的猜测是 GCC 的编译方式在给定的指令集上是相同的,独立于操作系统。 不存在灰色地带。它要么是明确定义的(在这种情况下它将跨平台工作)。或者它是实现定义的(在这种情况下,请阅读编译器文档以了解这意味着什么)或者它是未定义的(这意味着行为可能会通过提高优化级别而改变)。如果您有未定义的行为,您甚至无法保证构建之间的相同行为,因此肯定不是灰色的,它只是纯黑色。您可能会争辩说定义的实现是灰色的,但这些都有很好的记录,您应该知道它何时发生(因为编译器会发出警告)。 @Martin:未定义根本不是这个意思。在大多数现代操作系统上,未定义的行为意味着 OMGWTFBBQAAAAAAAAHPROGRAMCRASH,或者根本没有,或者介于两者之间的所有内容,如有必要,可以同时进行。除了在你的鼻子里神奇地产卵的恶魔。 @Martin 除了讨论的编译器不是 100% 符合标准的,因此推理不成立,它可能定义良好,但并不意味着每个人都能正确实现它 【参考方案1】:

一点也不。

使用 MSVC 和 MinGW 编译代码可确保您的代码与 Microsoft 的 C/C++ 库兼容。我知道你只是在谈论代码兼容性,但这样的事情并不存在。如果您将 C++ 推入灰色区域,很可能相同的代码会根据您编译它的平台而产生不同的结果。

保证完全兼容性的最好也是唯一的方法是在两个平台上编译和测试它。

虽然将 GCC 与 -std=c++0X -Wall -Wextra -pedantic(或任何其他标准版本)一起使用并消除所有警告将很好地了解代码质量。

【讨论】:

【参考方案2】:

说实话?保证您的代码可以在任何平台上使用 GCC 编译是不可能的。总有可能发生某些事情,尤其是当您使用代码做“异国情调”的事情时。

【讨论】:

【参考方案3】:

您也可以尝试使用 cygwin 进行编译,这样可以更好地了解它将如何在更像 Unix 的系统上构建(尽管它仍然不能保证在所有系统上都可以工作,但它比仅尝试 msvc 和 MingW 更好都只是 Windows 编译器)。

【讨论】:

以上是关于在 Mingw 上编译的 C/C++ 代码能否保证与 GCC 完全兼容(在 linux 和 Mac 上)的主要内容,如果未能解决你的问题,请参考以下文章

在 AXP 服务器上编译的问题

在windows上用CodeBlocks+MinGW+WxWidgets开发的程序,是不是可以在Linux和Mac上编译

为啥在我的 Mac 上编译的 C++ 库不能在服务器上运行?

链接在 cygwin 上编译的 .lib 文件

在 Windows 上编译的 Matlab 应用程序是不是可以在 Linux 下运行?

为啥在两台略有不同的机器上编译的库的行为略有不同?