LLVM 3.4 では type_traits のエラーがあってビルドができませんでしたが、どうなったのか確認してみました。
対象プログラムは例のごとく iutest を使用しました。
※ LLVM 3.4 のときの対処は「ブログズミ: [LLVM 3.4] Clang for Windows を使ってみた」を参考にしてください。
※ clang for windows はこちらからダウンロードできます。
error : cannot compile this try statement yet
ostream(800,3): error : cannot compile this try statement yet _TRY_IO_BEGIN ^~~~~~~~~~~~~ ostream(19,24) : note: expanded from macro '_TRY_IO_BEGIN' #define _TRY_IO_BEGIN _TRY_BEGIN /* begin try block */ ^ xstddef(30,21) : note: expanded from macro '_TRY_BEGIN' #define _TRY_BEGIN try {try ステートメントでなぜかエラーが出ます。まだ対応していないようです。
[LLVMdev] Clang Integration with MSVS 2013
こちらを参考に /GR- /D_HAS_EXCEPTIONS=0 をコンパイルオプションに追加することで解決しました。
(/GR- :「ランタイム型情報を有効にする」を「いいえ」に設定)
error : expected class name
typeinfo(190,11): error : expected class name : public exception ^ typeinfo(194,5): error : member initializer 'exception' does not name a non-static data member or base class : exception(_Message)exception クラスがないと怒られます。
エラー行を見るとわかりますが、_HAS_EXCEPTIONS=0 の場合でも bad_cast や bad_typeid などの例外クラスが定義されるようで、この例外クラスが exception クラスを基底クラスに持つのですが、なぜか exception ヘッダーがインクルードされていないため、エラーになっているようです。
よって、typeinfo をインクルードする前に exception ヘッダーをインクルードすることで解決しました。
error : array initializer must be an initializer list
assertion.cpp(191,17): error : array initializer must be an initializer list const char16_t c16[] = u"test"; ^ assertion.cpp(196,17): error : array initializer must be an initializer list const char32_t c32[] = U"test"; ^
char16_t/char32_t の配列初期化に初期化リストを要求されました。
重要な機能ではないので、char16_t/char32_t は非対応としてビルドするようにしました。
ビルド成功
上記対応をすることでビルドが通るようになりました!やりました。実行もできます。
まだ対処しないといけない部分がありますが、動くものが作れるようになりました。
今回やったこと以外にも対処が必要だったり、問題があったりするかもしれませんが、Visual Studio で clang が扱えるようになるのはありがたいことです。今後にも期待したいと思います。
以上。
0 件のコメント:
コメントを投稿