具备完整C++11支持的Windows C++编译器(应与Qt兼容)

52
哪个C++编译器目前在Windows平台上支持完整的C++11?
微软编译器当前不支持完整的C++11(而且它不会很快添加)。 MinGW g ++(来自mingw.org)默认不支持 std :: thread 。 它还无法编译Qt 4源代码(在构建QtGuid4.dll时内存不足,已知的解决方法对我没用)。 我浪费了几天时间尝试使clang在Windows上工作,设法编译它,但无法启用c ++ 11支持,因为它需要libstdc ++,而(我认为)此时尚未将其移植到Windows平台。 它也不受Qt 4的支持。
还有什么其他选择吗? 我已经使用C ++ 03工作了很长时间了,我想尝试一下新功能,但我不想要一个支持不完整的工具(这会增加编写代码时的额外麻烦),或者在链接库时会耗尽内存(在8GB系统上)。
我正在使用Windows 7 64位,并且虽然拥有64位支持很好,但我主要感兴趣的是32位应用程序,因此能够生成64位可执行文件是可选的。
有什么建议吗?

1
你尝试过Nuwen的MingW发行版吗?编译器版本是4.8.1,根据这个网址:http://gcc.gnu.org/gcc-4.8/cxx0x_status.html,它应该支持线程。 - Adri C.S.
8
很遗憾,目前没有任何平台有完全支持C++11的编译器。 - user1233963
1
@Angew:MSVC 12.0编译器(来自VS 2013)到底缺少什么? - Violet Giraffe
1
http://wiki.apache.org/stdcxx/C++0xCompilerSupport 给出了不同编译器对 C++11 的支持情况概述。 - Greg
1
@Greg的比较表还没有更新到VC12(VS2013)。如果想了解微软最新编译器中添加了哪些额外的C++11功能,可以查看他们的功能比较表:http://msdn.microsoft.com/en-us/library/vstudio/hh567368%28v=vs.120%29.aspx - Dan Is Fiddling By Firelight
显示剩余8条评论
3个回答

65
首先,请查看GCC 4.8中C++11实验性支持的状态。目前只有一个提案尚未正式实现。然后,查看libstdc++中C++11实现的状态。你可以看到一些功能尚未实现。尽管如此,我们可以说,在GCC中,C++11支持已经是完整和可用的。

现在,关于Windows:我个人认为,MinGW-w64是最好的本地(不是Cygwin!)GCC移植版,我认为这是生产质量级别的。你可以在这里下载它。当前(撰写本文时)的最新版本基于GCC 4.8.2。它已经支持了std::thread。更重要的是,它提供了所有可能的变体:

  • 64位目标;
  • 32位目标;
  • Win32线程;
  • POSIX线程;
  • SEH异常;
  • DWARF异常;
  • SJLJ异常。

注意:
选择要下载的发行版时要小心:为了使std::thread可用,你需要选择带有POSIX线程的版本。

此外,我确认自己已经多次使用这个工具链构建了Qt 4.8.4和4.8.5,甚至是针对64位进行编译。但这还不是全部,在下面列出了我个人使用MinGW-w64构建的一些亮点:

我认为,通过使用MinGW-w64的GCC编译器,能够构建如此庞大和多样化的代码库(例如64位Windows目标),这是MinGW-w64开发团队惊人的成就。这再次证明了该工具链的质量。

Qt 5


最近我使用MinGW-w64 4.8.2,针对x64平台,构建了Qt 5.1.1应用程序框架。总体而言,进展非常顺利,但在构建之前需要解决一些小问题。我已经收集了所有必需的补丁,并编写了一个简单的批处理脚本,可以自动完成打补丁、构建和安装等整个过程。如果您感兴趣,请查看我的Qt for Windows。使用非常简单,我将让你们阅读批处理脚本,而不会进行任何注释。请记住,您需要Unix的patch.exe来应用补丁,您可以从MSYS或MSYS2等地方获取(见下文)。您可以从这里获取Qt 5.1.1源代码。

注意:
再也没有必要重新发明轮子(维护个人构建脚本和Qt补丁)。 MSYS2(见下文)现在可以处理所有事情。 如果您需要使用不同的选项和/或标志重新构建Qt,则只需在本地编辑相应的PKGBUILD文件,并相应地使用makepkg-mingw实用程序。 注意:
实际上,Qt项目正式推荐使用MinGW-w64和MSYS2

关于MSYS2


虽然这不是直接问的问题,但我认为将其添加到这里很有用,因为它是MinGW-w64的姐妹项目,并且对于任何必须使用类Unix环境在Windows上开发本地软件的人来说非常有用。

那些曾经使用过原始MSYS的人可能知道它有多老旧。 它已经很长时间没有得到改进,那里的所有Unix实用程序都已经过时。

提供MinGW-w64构建的人(如上所述),现在也提供MSYS2的构建,您可以在此处下载。 最近,它已经退出beta版,请确保查看最新版本。它适用于x86和x64架构(与MinGW-w64工具链本身一起)。 所有实用程序都已更新为其最新版本。 例如,您已经可以享受像Bash 4.2、Make 3.99、Git 1.8.4等功能,这些功能在Windows上原生运行!

注意:
请务必查看他们的Wiki以获得顺畅的启动。

超越MinGW-w64的简短故事


最初的MinGW改进缓慢,其开发者甚至没有考虑添加64位目标生成支持。Kai Tietz这个雄心勃勃的家伙接手了它,并将它分叉出来,因为他的公司需要在Windows上构建64位目标。这就是MinGW-w64项目的诞生。尽管主要目标是添加64位支持,但开发人员在许多方面改进了工具链并解决了许多其他问题。从那时起,MinGW-w64项目已经发展壮大,现在在质量方面远远超过MinGW。当MinGW-w64提议与MinGW“联合”并共同工作时,MinGW的开发人员反应不足并拒绝合作。因此,今天有两个名称相似的项目,有时会引起混淆,但质量和支持上的差异是显而易见的。


10
他们本应该选择一个全新的名称。MinGW是在Cygwin的基础上建立的。MinGW-w64则是在MinGW的基础上建立而成的。归根结底,它就是Win64-GCC,他们本应该直接称之为这个名字。 - Warren P
听起来非常有前途,我会去看看。 - SigTerm
1
很好。只是需要注意:“因此我们可以说,GCC对C++11的支持已经算是相当完整了。”但这并不是全部,因为仍有许多C++11所需的标准库特性/组件缺失。 - Johan Lundberg
@Johan Lundberg:好的,已经修改完毕。 - Alexander Shukaev
上次我检查(大约两个月前),MinGW-w64 的 std::random_device 已经损坏。这只是提醒需要 <random> 的任何人。 - Siyuan Ren
显示剩余3条评论

8
核心语言方面,Clang 3.3和GCC 4.8.1已经完全符合C++11标准了(虽然它们是否无bug是另一个话题)。就库(STL)而言,只有Clang 3.3(使用libc++,但是你知道,libc++在Windows和Linux中都还无法使用)是唯一完全符合C++11的平台。
最新的MSVC,Visual C++2013(目前为RC版本,将于11月13日发布RTM并正式可用),在核心语言和STL方面都提供了更好的C++11支持,尽管还不完整。就STL而言,据我所知,它是完整的。
我认为这取决于您的代码实际使用了哪些特性。所有的C++11新特性都被利用了吗?如果Visual C++2013的功能集可以满足您的要求,请使用它。否则,clang已经提供了一个Windows端口,可以集成到Visual Studio中,并且已经可以链接到本机(msvc c++ runtime)库了(声称),我想你也可以试试。
补充: Visual C++11/14符合性路线图 https://udta1g.blu.livefilestore.com/y2pMXBJL7l2a5UOf_pXnLXghSUhPWK8w5skFyc50SVFcMjVwa1guQnM6R0NNLN1buBUNPGbLBejpYXXBXSbqshQKKWVfQxvJjk2jGRPPbL-UBu7gaao4RxifZgPXY5ksdei/image1.png?psid=1

现在在Windows上,Clang很糟糕,不是吗? - Warren P
@WarrenP:有点吧,至少现在有官方的二进制文件了... - MFH
没有可用的Windows STDLIBC。 :-) - Warren P

0

Clang完全支持Windows(除了libc++中的Windows标准库错误)。 您可以从此处下载clang 3.3的“官方”Windows版本:http://www.llvm.org/builds/

它不包括libc++,因此您需要下载libc++或您选择的标准库。如果可能的话,我建议使用libc++,因为这是目前最完整的库实现,尽管我不知道它在Windows上的表现如何。


2
据我所知,它在Windows上的运行效果不是很好。我尝试过构建它,如果你检查libc++的Windows状态,会发现它充满了“需要调查”的信息。此外,我使用clang编译Qt 4的尝试也失败了。 - SigTerm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接