ちょっとyaml形式でログを吐きたくてyaml-cppを使ってみようと思ったものの、ビルドではまったので対応メモです。
まずは普通にビルド
yaml-cppはCMakeLists.txtを持っているため、CMakeを使えば簡単にVisual Studioのソリューションファイルを作ることができます。
ここは特に設定を何も変更せず、デフォルトのままで問題ないです。
ただ、できたソリューションファイルをそのままビルドしてもコンパイルエラーが大量に発生してしまうので、そいつらに対処してやる必要があります。
「 C3646 ‘_NOEXCEPT’: 不明なオーバーライド指定子です」のエラーの対応
さて、ビルドしたらエラーがたくさん出ます。その中で、まずは以下のエラーの対応を行います。

src/exceptions.cppとinclude/yaml-cpp/exceptions.hに
// This is here for compatibility with older versions of Visual Studio
// which don't support noexcept
#ifdef _MSC_VER
#define YAML_CPP_NOEXCEPT _NOEXCEPT
#else
#define YAML_CPP_NOEXCEPT noexcept
#endif
というような記述があります。これを、
// This is here for compatibility with older versions of Visual Studio
// which don't support noexcept
//#ifdef _MSC_VER
// #define YAML_CPP_NOEXCEPT _NOEXCEPT
//#else
#define YAML_CPP_NOEXCEPT noexcept
//#endif
こうしてしまいましょう。すなわち、1行だけ残してコメントアウトしてやります。
ちなみにこのエラーですが、_NOEXCEPTがVisual Studio 2017 version 15.8で削除されたことが原因です。なので、Visual Studio 2017でもこれより古いバージョンであればこのエラーは出ないと思われます。

STL Features and Fixes in VS 2017 15.8 - C++ Team Blog
15.7 was our first feature complete C++17 library (except floating-point ), and in 15.8 we have addressed large numbers ...
なお、最新のmasterリポジトリではこの問題は修正されているので、次期バージョンではこの問題は解決されるものと思われます。
「C2220 警告をエラーとして扱いました。’object’ ファイルは生成されません。」の対応
ここまでくればエラーがかなり減っていて、あとはこのエラーだけかと思います。
構成プロパティ → C/C++ → 全般の、警告をエラーとして扱うをいいえ (/WX-)に設定します。

対象は以下のプロジェクトファイルです。
- gmock
- gmock_main
- gtest
- gtest_main
これで、無事yaml-cpp 0.6.2がVisual Studio 2017でビルドが成功すると思います。



コメント