用C++11在Cygwin上叮当

Clang on Cygwin with C++11

本文关键字:叮当 Cygwin C++11      更新时间:2023-10-16

我在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的情况下不起作用,或者我可以做些什么来解决这个问题?

它看起来像标准库中的错误。 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 下编译没有问题。

使用 C++11 让 Clang 包在 Cygwin 上工作是可能的,而且相对容易。

例如,您描述的错误可以通过添加

#ifdef __clang__
    class type_info;
#endif

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

不过,这是不幸的,希望Cyginw gcc软件包将更新到C++标准库的较新版本。

我认为

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

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