【问题标题】:Is it possible to compile C++ sources with Clang 3.1 plus VC11 Beta headers?是否可以使用 Clang 3.1 和 VC11 Beta 头文件编译 C++ 源代码?
【发布时间】:2012-04-25 02:04:32
【问题描述】:

我正在尝试在 Windows 上使用带有 clang 的 stl 标头编译一个相当简单的“hello world”程序,但我无法做到。

我已经使用 VC11 Beta 从存储库编译了 Clang 3.1,没有任何问题。 现在我正在尝试使用已经编译的 Clang 来使用 VC11 标头编译一个“hello world”示例,但是我得到了一堆错误,这似乎表明 Clang 正在迷失在 VC11 上模拟可变参数模板的一些宏魔法中,虽然我没有直接使用这个宏魔法。

我的包含目录:

  • C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include
  • C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include
  • C:\Program Files (x86)\Windows Kits\8.0\Include\um
  • C:\Program Files (x86)\Windows Kits\8.0\Include\shared
  • C:\Program Files (x86)\Windows Kits\8.0\Include\winrt

我收到如下错误:

C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\xstddef:1094:24: 错误:'_Nil' 没有引用值

还有一堆其他与宏相关的东西。

有人能够克服这个宏观问题吗?扩展此宏时 clang 预处理器是否存在问题?

【问题讨论】:

  • 抛开宏,这不起作用,因为 Clang 不处理 __declspec
  • @ildjarn 所以我认为头文件中没有满 __declscpec,使用 VC10 我能够使用 iostream 头文件(以及 VC10 中的其他头文件)毫无问题地编译相同的源代码。
  • @Chico:那是因为 VC10 理解 __declspec。 Clang 没有。
  • @NicolBolas 抱歉,我的意思是说“使用 VC10 标头”。假设与出现的问题相同的配置,只更改编译器版本,我没有遇到这些问题。

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


【解决方案1】:

我非常确定您将无法使用 clang 来编译某些头文件,例如 C:\Program Files (x86)\Windows Kits\8.0\Include\winrt。原因是因为 Windows 8 带来了带有一些扩展的 C++ 版本。这个版本被称为 C++/CX

一些扩展(如ref class)不是标准的C++。我相信这会导致构建消息说您正在尝试编译一些可变参数模板。

【讨论】:

  • WinRT相关的扩展在这种情况下不是问题,我没有使用它们,而且问题似乎与此无关。我想我可以完全删除那个包含目录。
  • 你确定这些扩展都没有出现在标题中吗?我看到了来自 clang 团队的一个名叫 Caruth 的人发表的演讲,他们说由于几个问题,clang 还不能用于 Windows。
  • 是的,在一些头文件中使用了 C++/CX,但是这种用法总是用#ifdef __cplusplus_winrt 保护的。否则,标头将无法在任何不使用/ZW 的程序中使用。对于标头中特定于 C++/CLI 的功能,使用 __cplusplus_cli 预定义宏也是如此。这些语言扩展不应该有任何问题。
  • 但是,Clang 可能无法使用 Visual C++ 标准库标头肯定还有其他原因。除其他原因外,头文件依赖于许多 Visual C++ 和 Windows 特定的功能(例如编译器内在函数、非标准库函数),并且至少在某些地方库代码可能很好地依赖于 Visual C++ 编译器中的不合格行为。跨度>
【解决方案2】:

Microsoft 的 C++ 标头包含尚不支持的扩展和特性。 Clang 可以在 Windows 上使用 C 头文件构建程序,但还不能使用 C++ 头文件。

由于 C 运行时有效,您可能能够使用仅依赖于 C 运行时的不同 C++ 标准库。我没试过,不过也许libc++可以这样用。

【讨论】:

  • 我能够使用 VC10 头文件进行编译。在 Windows 上缺乏对 libc++ 的一流支持。如果有什么特殊之处,我想确切地知道这是什么。
  • @Chico 我没有努力,但是clang++ -std=c++11 file.cpp 与源#include <vector> 导致许多错误,如error: unknown type name '__m256'
  • 嗯,他们,也许我有一些内存差距......我只记得使用这个头文件编译琐碎的 C++ 示例没有太多麻烦。
猜你喜欢
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 2017-07-28
  • 2014-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多