7

我在 Cygwin 上安装了 Clang 并尝试编译此代码:

#include <iostream>
int main() {
  std::cout << "hello world!" << std::endl;
  return 0;
}

如果我这样做,那效果很好clang++ file.cpp。如果我这样做是行不通的clang++ file.cpp -std=c++11。我从这样的标准标题中得到错误:

In file included from file.cpp:1:
In file included from /usr/lib/gcc/i686-pc-cygwin/4.5.3/include/c++/iostream:39:
In file included from /usr/lib/gcc/i686-pc-cygwin/4.5.3/include/c++/ostream:39:
In file included from /usr/lib/gcc/i686-pc-cygwin/4.5.3/include/c++/ios:39:
In file included from /usr/lib/gcc/i686-pc-cygwin/4.5.3/include/c++/exception:150:
/usr/lib/gcc/i686-pc-cygwin/4.5.3/include/c++/exception_ptr.h:132:13: error:
      unknown type name 'type_info'
      const type_info*

Cygwin Clang 是否不能在打开 C++11 的情况下工作,或者我可以做些什么来解决这个问题?

4

3 回答 3

5

它看起来像标准库中的一个错误。exception_ptr.h 仅包含在 C++11 模式中,这就是为什么您在其他情况下看不到它的原因。问题是,正如错误所说,没有声明 std::type_info 。似乎 GCC 神奇地向前声明了 std 命名空间中的某些名称,这就是它不受影响的原因!你可以用一个简单的程序自己证明:

namespace std {  

    class A
    {
    public:
         type_info* B();
    };
}

这与 GCC 4.5.3 一起编译,但无论 -std 设置如何,Clang 都会出错。

该问题已在最新版本的 GCC 中得到修复,因此手动更新可能是您最好的选择。配置了 --enable-languages=c,c++ 的 4.7.2 版本在 Cygwin 下编译没有问题。

于 2012-11-01T23:45:11.057 回答
5

使用 C++11 让 Clang 包在 Cygwin 上运行是可能的并且相对容易。

例如,您描述的错误是通过添加来修复的

#ifdef __clang__
    class type_info;
#endif

exception_ptr.h. 另一个需要修复的错误是将复制构造函数添加到std::pair.

不过,这很不幸,希望 Cyginw gcc 包能够更新到 C++ 标准库的更新版本。

于 2013-01-17T12:43:57.390 回答
0

我认为默认情况下,Windows 上的 clang 将使用 ms 兼容模式和 ms 扩展。Windows 上的这些和其他默认值可能不适用于 Cygwin。

使用该-###标志来获取从驱动程序传递给编译器的实际选项,以便您可以尝试调整它们。

于 2012-10-17T17:54:14.723 回答