Bja*_*une 6 c++ cygwin clang++
我在Cygwin上安装了Clang,我尝试编译这段代码:
#include <iostream>
int main() {
std::cout << "hello world!" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我这样做,那很好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*
Run Code Online (Sandbox Code Playgroud)
Cygwin Clang是不是开启了C++ 11,或者我可以做些什么来解决这个问题?
它看起来像标准库中的错误.exception_ptr.h仅包含在C++ 11模式中,这就是为什么你没有看到它.正如错误所说,问题是没有声明std :: type_info.似乎GCC神奇地向前在std命名空间中声明了某些名称,这就是为什么它不受影响!你可以用一个简单的程序自己证明:
namespace std {
class A
{
public:
type_info* B();
};
}
Run Code Online (Sandbox Code Playgroud)
这与GCC 4.5.3一起编译,但无论-std设置如何,Clang都会出错.
该问题已在最新版本的GCC中修复,因此手动更新可能是您最好的选择.使用--enable-languages = c,c ++配置的4.7.2版本在Cygwin下编译没有问题.
使用 C++11 在 Cygwin 上运行 Clang 包是可能的并且相对容易。
例如,您描述的错误是通过添加来修复的
#ifdef __clang__
class type_info;
#endif
Run Code Online (Sandbox Code Playgroud)
到exception_ptr.h。另一个需要修复的错误是向std::pair.
不过,这很不幸,希望 Cyginw gcc 包将更新为更新版本的 C++ 标准库。