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 でコンパイルされますが、Clang は -std 設定に関係なくエラーを出します。

この問題は GCC の最新バージョンで修正されているため、手動で更新するのがおそらく最善の策です。--enable-languages=c,c++ で構成された 4.7.2 リリースは、Cygwin で問題なくコンパイルされます。

于 2012-11-01T23:45:11.057 に答える
5

C++11 を使用して Cygwin で動作する Clang パッケージを取得することは可能であり、比較的簡単です。

たとえば、説明しているエラーは、追加することで修正されます

#ifdef __clang__
    class type_info;
#endif

exception_ptr.h。修正が必要なもう 1 つのエラーは、コピー コンストラクターを に追加することstd::pairです。

残念なことですが、Cyginw gcc パッケージが C++ 標準ライブラリの新しいバージョンに更新されることを願っています。

于 2013-01-17T12:43:57.390 に答える
0

デフォルトでは、Windows の clang は ms-compatitblity モードと ms-extensions を使用すると思います。Windows のこれらおよびその他のデフォルトは、Cygwin には適切でない場合があります。

フラグを使用-###して、ドライバーからコンパイラーに渡される実際のオプションを取得し、それらを微調整してみてください。

于 2012-10-17T17:54:14.723 に答える