yaml-cpp 0.6.2をVisual Studio 2017以降でビルドする

ちょっとyaml形式でログを吐きたくてyaml-cppを使ってみようと思ったものの、ビルドではまったので対応メモです。

まずは普通にビルド

yaml-cppはCMakeLists.txtを持っているため、CMakeを使えば簡単にVisual Studioのソリューションファイルを作ることができます。

ここは特に設定を何も変更せず、デフォルトのままで問題ないです。

ただ、できたソリューションファイルをそのままビルドしてもコンパイルエラーが大量に発生してしまうので、そいつらに対処してやる必要があります。

「 C3646 ‘_NOEXCEPT’: 不明なオーバーライド指定子です」のエラーの対応

さて、ビルドしたらエラーがたくさん出ます。その中で、まずは以下のエラーの対応を行います。

src/exceptions.cppinclude/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 of outstanding bugs. As usual, we’ve mai...

なお、最新のmasterリポジトリではこの問題は修正されているので、次期バージョンではこの問題は解決されるものと思われます。

「C2220 警告をエラーとして扱いました。’object’ ファイルは生成されません。」の対応

ここまでくればエラーがかなり減っていて、あとはこのエラーだけかと思います。

構成プロパティ → C/C++ → 全般の、警告をエラーとして扱ういいえ (/WX-)に設定します。

対象は以下のプロジェクトファイルです。

  • gmock
  • gmock_main
  • gtest
  • gtest_main

これで、無事yaml-cpp 0.6.2がVisual Studio 2017でビルドが成功すると思います。

コメント