GCC值得在Windows上使用以取代MSVC

GCC worth using on Windows to replace MSVC?

本文关键字:取代 MSVC 值得 Windows GCC      更新时间:2023-10-16

我目前使用Visual Studio 2010在Windows上使用c++进行开发。在c++ 11正式发布之后,我开始使用MSVC中已经提供的一些特性。但是,正如预期的那样,绝大多数新更改都不支持。

我想也许即将到来的Visual Studio版本会添加这些新功能。然而,在读完这篇文章之后,看起来几乎没有什么变化。

所以,我很好奇在Windows上使用GCC而不是MSVC的可行性,因为它似乎已经支持了绝大多数的c++ 11。据我所知,这将意味着使用MinGW(我还没有看到任何其他本机Windows版本的GCC)。但我对这是否值得一试有疑问:

  • 它可以作为cl.exe的替代品,或者它会涉及很多hack和兼容性问题,让Visual Studio使用不同的编译器吗?
  • 在我看来,Visual Studio的主要卖点是它的调试器。如果您使用不同的编译器,它仍然可用吗?
  • 由于GCC来自*nix世界,并且不是本机Windows,是否存在创建本机Windows应用程序的代码质量问题,而不是使用本机MSVC编译器?(我的大部分项目都是游戏)
  • 换句话说,使用非windows本机编译器会影响我编译的exe的质量吗?

MSVC有一个巨大的优势,它带来了一个在Windows下无与伦比的IDE,包括调试器支持。

对于MinGW来说,最好的选择可能是Code::Blocks,但是在这两者之间,特别是在代码完成和调试器方面。

此外,MSVC允许你使用一些专有的微软的东西(MFC, ATL,可能还有其他的),而MinGW不支持,并使使用GDI+和DirectX更容易,更直接(尽管它可能在MinGW中做到这两点)。

Cygwin,正如在另一篇文章中提到的,将有额外的依赖关系和可能的许可证问题(依赖关系是GPL,所以你的程序也必须是)。MinGW没有任何这样的依赖或问题。

MinGW编译也明显比MSVC慢(尽管预编译的头文件有一点帮助)。

尽管如此,GCC/MinGW是一个完全可靠的高质量编译器,在我看来,就生成代码的质量而言,它优于任何迄今为止可用的MSVC版本。
在最新版本的MSVC中,这一点不那么明显,但仍然可见。特别是对于任何与SSE、intrinsic和内联汇编相关的东西,GCC已经完全消灭了MSVC(尽管它们正在慢慢赶上)。

标准遵从性在GCC中也要好得多,这可能是一把双刃剑(因为这可能意味着您的一些代码无法在更符合标准的编译器上编译!),c++ 11支持也是如此。

MinGW还可以选择支持DW2异常,这与"正常"风格完全不兼容,并且在可执行文件中占用更多空间,但积极的一面是在运行时"几乎零成本"。

我想添加一些信息,因为自提问以来字段可能已经更改。

放弃MSVC的主要问题是缺乏一个与MinGW完美集成的优秀IDE。Visual Studio是一个非常强大的工具,在相当长的一段时间里,它是Windows上唯一的播放器。然而,几天前,Jetbrains发布了他们新的c++ IDE CLion的预览版本。

主要的好处是在跨平台应用程序上工作。在这种情况下,基于GCC的工具链可以使工作轻松得多。此外,CLion与CMake紧密集成,这也是与Visual Studio相比的一大优势。因此,在我看来,现在值得考虑切换到MinGW。

GCC对c++ 11的支持是相当惊人的(并且与标准一致性相当,现在<regex>已经实现了)。

如果你替换了编译器,你需要确保每个依赖都可以用新的编译器构建。它们不是可替换的插件(尽管Clang正在朝着这个方向努力)。

GCC是一个很好的编译器,可以生成与MSVC性能相当的代码,如果不是更好的话。不过,它缺少一些windows特有的低级功能。

除此之外,为了回答你的问题:

  1. 要让VS使用GCC作为编译器,你几乎需要一直转向makefiles或自定义构建步骤。你最好从命令行编译并使用CMake或类似的东西。
  2. 你不能对GCC代码使用VS调试器。GCC输出GDB兼容的调试信息,而VS的调试格式是专有的,所以在这方面不会很快改变。
  3. 代码质量和你想要的一样好。看到上面。
  4. 不,您的代码质量实际上会提高,因为GCC会指出MSVC会对您隐藏的几个假定的标准扩展。所有自尊的开源项目都可以用GCC编译。

我的拙见,这取决于一个人最初是如何开始编码的。我已经使用g++和gcc超过20年了,但我一直使用gcc的原因主要是出于许可的原因。虽然我也喜欢它,当我没有一堆运行时依赖或dll捆绑我的东西,因为我来自DOS时代,我仍然喜欢我的东西小而快。用于Windows的GCC带有标准的win32库和通用控件,但我必须开发自己的win32控件来处理可能需要MCF屎才能正常工作或只是为了看起来更好。

虽然gcc可能在internet上有强大的支持,但当涉及到win32的东西时,许多依赖于mcf和vc专有的东西,所以再次,一个人可能不得不自己解决问题,并在困难出现时具有创造性。

我认为这都是需求和环境的问题。如果你只是一个业余程序员,有时间研究,创建自己的库和东西,但你想要一个可靠的编译器,从80年代末开始,并且是免费的,那么gcc听起来是完美的工作。

但是在这个行业中,如果你想保持竞争力并留在竞争中,视觉工作室是必须的。许多硬件制造商更愿意为他们的硬件捆绑visual studio兼容的库,而不是一些开源的gnu东西。

那是我的两分钱。

说实话,c++应该用MS Visual Studio来处理。如果您想制作跨平台或Unix应用程序,请使用GCC。GCC可以与除Visual Studio以外的任何IDE一起使用。甚至Visual Studio Code也可以使用GCC。Code::Blocks,用于C/c++开发人员的Eclipse IDE, CLion, notepad++,甚至是我们一直知道的好工具Notepad与GCC一起工作。最后,在磁盘空间较小的PC上,安装Visual Studio的"桌面开发与c++";大概是5gb,如果它有用的话。这就是GCC对MSVC的打击。它有原生C语言支持。MSVC可以编译C语言,但需要进行大量的微调。最终能够编译需要花费大量的时间和精力。最终判决:

如果MSVC工作,它就会工作!如果MSVC不工作,那么它就不工作了。

如果安装了GCC,它可以工作,如果不工作,那是IDE的问题。

GCC是为那些不介意花4个小时在电脑前使它正常工作的人准备的。MSVC是为那些不关心C语言的人准备的,他们想要安装它,而不需要任何麻烦。

它不能直接替换微软编译器,首先它有一组非常不同的命令行参数和编译器特定的选项。

您可以使用MinGW或Cygwin来编写软件,但会引入额外的依赖项(特别是在Cygwin的情况下)。

与cl相比,gcc的一个不常被吹捧的优点是,gcc可以与ccache一起使用,从而大大加快重建速度,或者使用其他几台机器作为编译器的从属机器来构建distcc。

考虑使用Intel编译器(或者他们称之为"Composer")作为另一种选择。我不太确定与MS相比,它对c++ 11的支持在哪里(当然它有lambdas),但它确实与VisualStudio集成得很好(例如,解决方案中的不同项目可以使用Intel或MS编译器),并且还做出了一些努力来匹配MS编译器命令行选项。

GCC和MSVC对c++使用不同的名称混淆约定。一个编译器编译的c++ dll不能在另一个编译器编译的应用程序中使用。我相信这是我们没有看到gcc在windows中更广泛使用的主要原因。