Я установил Clang на Cygwin и пытаюсь скомпилировать этот код:
#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, но Clang выдает ошибку независимо от значения параметра -std.
Проблема исправлена в последней версии GCC, поэтому обновление вручную, вероятно, является лучшим выбором. Релиз 4.7.2, настроенный с параметром —enable-languages = c, c ++, не компилирует никаких проблем в Cygwin.
Можно и сравнительно легко заставить работать пакет Clang на Cygwin с C ++ 11.
Ошибка, которую вы описываете, например, исправлена добавлением
#ifdef __clang__
class type_info;
#endif
в exception_ptr.h
, Другая ошибка, которую необходимо исправить, — добавить конструктор копирования в std::pair
,
Это, к сожалению, и, надеюсь, пакеты gcc Cyginw будут обновлены до более новой версии стандартной библиотеки C ++.
Я думаю, что по умолчанию Clang в Windows будет использовать режим MS-совместимости и MS-расширений. Эти и другие значения по умолчанию в Windows могут не подходить для Cygwin.
Использовать -###
флаг, чтобы получить фактические параметры, передаваемые от драйвера к компилятору, чтобы вы могли попробовать настроить их.