带有 2 个编译器的 C++ [关闭]

Posted

技术标签:

【中文标题】带有 2 个编译器的 C++ [关闭]【英文标题】:C++ with 2 compilers [closed] 【发布时间】:2016-04-05 12:28:55 【问题描述】:

我有一个项目,我想在 Ubuntu 和 Windows 机器上编写代码。在 Ubuntu 上我使用 gcc,在 windows 上我想使用 MSVC。

用这样的 2 个不同的编译器编译相同的代码是个好主意吗?或者我会遇到问题吗?

谢谢。

【问题讨论】:

是的,使用两个独立的编译器进行编译是健康的。确保清除它们可能发出的警告消息(不是通过禁用它们,最好是通过理解和修复它们)。根据我的经验,在两侧都可以正常编译的代码也可以在两侧运行。 您可能会遇到问题,但这不应该阻止您。您可能需要使用一些依赖于平台的代码,这些代码通常由各种“platform.h”文件处理。该文件根据编译器和平台进行适当的定义,因此您不会将代码库与特定于平台的定义混淆。 @TomášZato:是什么让你认为程序员是为了解决没有问题的问题? @TomášZato Programmers.SE 还希望问题是关于某种特定问题(或至少是易于处理的小类问题)。我们有与 SO 相同的“过于宽泛”的密切原因。实际区别在于我们专注于软件设计问题而不是调试/实现问题。 @TomášZato:您会在 SO 上找到数百个类似的高票数问题。这并不意味着他们定义了规则。 【参考方案1】:

这是一个绝妙的主意。过去,我在代码中发现了一堆只有在切换编译器后才能看到的错误。

【讨论】:

哦,我从没想过他们会发现不同的错误,这很好!是否曾经因为工作方式不同而无法在一个编译器上编译代码?我在某处读到 msvc 与 gcc 有点不同,后者更接近于 c++ 标准。 是的。即使是相同的编译器,但版本不同。每个后续版本的 gcc 对违反 C++ 规则的小幅违规行为的容忍度较低,而早期版本的 gcc 往往会忽略。 您可以随时重写代码,使其在两个平台上都能编译(所需的更改通常很明显)。稍微可怕的情况是它们都可以编译但只有一个有效;在两个平台上测试!! (这通常发生在你不小心引入了未定义的行为,但一个平台做了你期望它做的事情。)【参考方案2】:

如果您想针对不同的平台进行编译,您必须使用不同的编译器进行编译(即使它们是同一编译器的不同版本)。

如果您同时使用 GCC 和 MSVC 进行编译,您会发现您无法使用每个编译器提供的大量扩展。您还会发现诸如 MSVC 之类的烦恼会在 _open 等函数的前面加上下划线。基本上,这归结为“欢迎来到便携编码的美妙世界”。

另一方面,一旦您开始为两个编译器编写代码,添加第三个编译器会变得容易得多 - 我建议将 Clang 作为一种便宜且令人愉快的静态分析工具添加到组合中。

【讨论】:

不要给 gcc 的人任何聪明的想法。就像在 Linux 版本中添加一个 win32 目标一样。 什么?你是说像Mingw? 不是 mingw 原生 Windows 端口吗?我指的是在 Linux 版本中添加一个 win32 交叉编译目标。这使得在技术上使用相同的编译器来构建 ELF 和 win32 二进制文件成为可能。 它基本上是带有一个为win32编译的win32代码生成器的gcc。现在,让代码生成器在正常的 gcc 中运行有多难,我不知道。 @SamVarshavchik 存在:apps.ubuntu.com/cat/search/?q=mingw&op=【参考方案3】:

Microsoft 让您可以在 Linux 机器上直接从 Visual Studio 编译代码,从而简化这一过程。挺好看的。

https://blogs.msdn.microsoft.com/vcblog/2016/03/30/visual-c-for-linux-development/

【讨论】:

以上是关于带有 2 个编译器的 C++ [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用 make 编译简单的 C++ 项目 [关闭]

c++ 在 Windows 上使用带有 Mingw 编译器的 iconv

优化C++软件

优化C++软件

有 C++ 反编译器吗? [关闭]

安装 C++ 编译器 [关闭]