【问题标题】:error compiling c++11 program with clang on windows在 Windows 上使用 clang 编译 c++11 程序时出错
【发布时间】:2012-10-18 19:35:18
【问题描述】:

我已经在 windows 上构建了 clang 3.2,并试图构建一个简单的 hello world 程序。但是我遇到了很多如下所示的错误。

d:\Marius\xyz>clang++ -stdlib=libc++ -std=c++11 -Wall xyz.cpp -o xyz.exe
clang++: warning: argument unused during compilation: '-stdlib=libc++'
In file included from xyz.cpp:12:
In file included from ./stdafx.h:18:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\algorithm:6:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\xmemory:6:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\xmemory0:9:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\xutility:8:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\utility:8:
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\type_traits:1072:
33: error:
  '_Ty' does not refer to a value
            _HAS_TRIVIAL_MOVE_CONSTRUCTOR(_Ty)
                                          ^

...

C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\xstddef:540:50: note:
      expanded from macro '_VARIADIC_EXPAND_4'
#define _VARIADIC_EXPAND_4(FUNC, X1, X2, X3, X4) \
                                                 ^
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\xrefwrap:222:22:note:
      expanded from macro '_CLASS_RESULT_OF_PMF_OPT_0X'
                        __thiscall, X2, X3, X4)
                                          ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.

我收到很多类似的错误,来自 VC++ 2012 标头。是否有可能在 Windows 上使用 clang++ 构建 C++11 代码?我必须提供额外的命令开关吗?

【问题讨论】:

  • -fms-extensions 也许吧。
  • 根据用户手册 (clang.llvm.org/docs/UsersManual.html) 默认启用该标志。我还尝试设置 -fmsc-version=1700 (即 VS2012)甚至 -fdelayed-template-parsing (这也应该是默认设置)。没有结果。删除 stdafx.h 对编译错误没有影响。
  • 我也尝试过将 mingw 头文件与 -isystem 一起使用,但这看起来像是一场配置噩梦。根据包含的顺序,我会收到不同的错误,并且无法在没有编译错误的情况下设置顺序。
  • @Mat 没有关于 stdafx.h 的 Microsoft 特定内容。这是一个完全符合标准的项目特定文件。如果您打开某些选项,Visual Studio 编译器只会缓存已编译的输出。

标签: c++ windows visual-c++ c++11 clang


【解决方案1】:

Visual Studio 构建时 Clang 无法正常工作(假设由 MinGW 构建时它可以正常工作,但我自己无法验证)。

当 Clang 被构建时,它被配置为使用用于构建它的库。由于您使用 Visual Studio 构建了 Clang,因此 Clang 将尝试使用 Visual Studio 头文件和库。不幸的是,Clang 和 Visual Studio 的内部结构完全不同,以至于 Clang 不能使用 VS 特定的标头。

libc++ 可以为 Windows 编译之前,Clang 将(几乎可以肯定)在 Visual Studio 编译时永远不会工作。尝试使用 MinGW 构建它(并发表一篇博文或其他关于你如何做到的东西!),看看它是否适合你。

【讨论】:

    【解决方案2】:

    clang 默认包含用于构建它的工具链。但与 MS 的情况一样,使用的扩展可能是特定于供应商的。 clang 自己的 libc++ 可用性有望大大缓解该问题。手动指定正确的包含目录。

    在构建期间还将编译和链接阶段分开。这将导致链接使用正确的二进制库而不是 VS 默认值。

    【讨论】:

      猜你喜欢
      • 2012-09-05
      • 2015-09-12
      • 2017-11-07
      • 1970-01-01
      • 1970-01-01
      • 2014-06-21
      • 2023-04-07
      • 2012-12-16
      • 1970-01-01
      相关资源
      最近更新 更多