完全支持C++11的Windows C++编译器(应与Qt一起使用)

Windows C++ compiler with full C++11 support (should work with Qt)

本文关键字:Qt 应与 一起 编译器 支持 C++11 C++ Windows      更新时间:2023-10-16

当前哪个C++编译器在windows平台上支持完整的C++11?

微软编译器目前还没有完全的C++11支持(而且不会很快添加)
MinGW g++(来自MinGW.org)不支持开箱即用的std::thread。它也无法编译Qt4源代码(在构建QtGuid4.dll时内存不足,已知的解决方法对我不起作用)
我花了几天时间试图让clang在windows上运行,并设法编译了它,但无法启用c++11支持,因为它需要libstdc++,而当时(我认为)没有移植到windows平台。Qt 4也不支持它。

还有什么?我已经为C++03工作了很长时间,我想尝试一下新功能,但我真的不想要一个支持不完整的工具(这会在编写代码时增加额外的头痛),或者在链接库时可能会耗尽内存(在8GB系统上)。

我正在开发Windows7 64位,虽然有64位的支持会很好,但我最感兴趣的是32位的应用程序,所以生成64位可执行文件的能力是可选的。

有什么建议吗?

首先,请参阅GCC 4.8中的实验性C++11支持状态。只有一个提议尚未正式实施。然后,查看C++11在libstdc++中的实现状态。正如您所看到的,一些功能尚未实现。尽管如此,我们可以声明GCC中的C++11支持或多或少是完整的并且可用的。

现在,关于Windows:可能肯定是GCC最好的原生(不是Cygwin!)端口,我个人认为它的生产质量是MinGW-w64。您可以在此处下载。当前(在撰写本文时)的最新版本基于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构建的一些亮点列表:

  • 增强C++库
  • Qt
  • LLVM/Clang
  • 谷歌V8 JavaScript引擎
  • ODB:C++对象关系映射(ORM)
  • SQLite
  • GLEW
  • Vim
  • ncurses
  • 等等

我认为能够用良好的旧GCC for Windows构建64位目标这样庞大而多样的代码库是MinGW-w64开发团队的一项奇迹般的成就。它再次证明了工具链的质量。

问题5


我最近使用针对x64的MinGW-w64 4.8.2构建了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版本,您可以在此处下载。最近,它推出了测试版,所以一定要查看最新版本。它是为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的开发商反应不足,拒绝合作。因此,今天有两个项目的名称相似,有时会引起混乱,但质量和支持方面的差异不言自明。

核心语言方面,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,将在2天后进行RTM,并于11月13日正式提供)在核心语言和STL中为C++11提供了更好的支持,但尚未完成。STL方面,afaik,它是完整的。

我认为这取决于你的代码真正使用的功能。是否使用了所有C++11的新功能?如果Visual C++2013的功能集能让你满意,那就试试吧。否则,clang已经提供了一个可以集成到Visual Studio的windows端口,并且可以链接到已经(声称)的本机(msvc++运行时)库,我想你也可以试用一下。

添加:Visual C++11/14一致性路线图https://udta1g.blu.livefilestore.com/y2pMXBJL7l2a5UOf_pXnLXghSUhPWK8w5skFyc50SVFcMjVwa1guQnM6R0NNLN1buBUNPGbLBejpYXXBXSbqshQKKWVfQxvJjk2jGRPPbL-UBu7gaao4RxifZgPXY5ksdei/image1.png?psid=1

Clang完全支持windows(libc++中的模块化windows标准库错误)你可以从这里下载clang 3.3的"官方"windows版本:http://www.llvm.org/builds/

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