OpenSource-Hub

yaml-cpp

ライブラリ

jbeder/yaml-cpp

YAML 1.2 を解析および生成するための C++ ライブラリ。

概要

yaml-cpp は、YAML 1.2 仕様に準拠した解析および生成機能を提供する C++ ライブラリです。CMake によるビルドをサポートしており、プロジェクトに簡単に統合できます。API は安定しており、C++ アプリケーションの設定ファイルの読み書きやデータシリアライゼーションに広く使用されています。

README プレビュー

# yaml-cpp  [](https://codedocs.xyz/jbeder/yaml-cpp/)\n\n`yaml-cpp` is a [YAML](http://www.yaml.org/) parser and emitter in C++ matching the [YAML 1.2 spec](http://www.yaml.org/spec/1.2/spec.html).\n\n## Usage\n\nSee [Tutorial](https://github.com/jbeder/yaml-cpp/wiki/Tutorial) and [How to Emit YAML](https://github.com/jbeder/yaml-cpp/wiki/How-To-Emit-YAML) for reference. For the old API (until 0.5.0), see [How To Parse A Document](https://github.com/jbeder/yaml-cpp/wiki/How-To-Parse-A-Document-(Old-API)).\n\n## How to Build\n\n`yaml-cpp` uses [CMake](http://www.cmake.org) to support cross-platform building. Install [CMake](http://www.cmake.org) _(Resources -> Download)_ before proceeding. The basic steps to build are:\n\n**Note:** If you don't use the provided installer for your platform, make sure that you add `CMake`'s bin folder to your path.\n\n#### 1. Navigate into the source directory, create build folder and run `CMake`:\n\n```sh\nmkdir build\ncd build\ncmake [-G generator] [-DYAML_BUILD_SHARED_LIBS=on|OFF] ..\n```\n\n  * The `generator` option is the build system you'd like to use. Run `cmake` without arguments to see a full list of available generators.\n    * On Windows, you might use "Visual Studio 12 2013" (VS 2013 32-bits), or "Visual Studio 14 2015 Win64" (VS 2015 64-bits).\n    * On OS X, you might use "Xcode".\n    * On a UNIX-like system, omit the option (for a Makefile).\n\n  * `yaml-cpp` builds a static library by default, you may want to build a shared library by specifying `-DYAML_BUILD_SHARED_LIBS=ON`.\n\n  * [Debug mode of the GNU standard C++\n    library](https://gcc.gnu.org/onlinedocs/libstdc++/manual/debug_mode.html)\n    can be used when both `yaml-cpp` and client code is compiled with the\n    `_GLIBCXX_DEBUG` flag (e.g. by calling CMake with `-D\n    CMAKE_CXX_FLAGS_DEBUG='-g -D_GLIBCXX_DEBUG'` option).\n\n    Note that for `yaml-cpp` unit tests to run successfully, the _GoogleTest_\n    library also must be built with this flag, i.e. t

FAQ (5)

トラブル対応
yaml-cpp のリンクエラー「relocation R_X86_64_PC32 ... can not be used when making a shared object; recompile with -fPIC」を修正するにはどうすればよいですか?

これは、インストールされている libyaml-cpp.a が位置独立コード(PIC)なしでビルドされているのに、プロジェクト側でそれを共有ライブラリにリンクしていることを意味します。PIC を有効にして yaml-cpp を再ビルドし、再インストールしてください:

git clone https://github.com/jbeder/yaml-cpp.git
cd yaml-cpp
mkdir -p build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=ON ..
cmake --build .
sudo make install

あるいは、フラグを直接渡すこともできます:

env CFLAGS="-fPIC" CXXFLAGS="-fPIC" cmake -DCMAKE_BUILD_TYPE=Release ..
make
sudo make install

もう一つの回避策として、yaml-cpp を代わりに共有ライブラリとしてビルドする方法もあります:

cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON ..
make
sudo make install

新しいコンパイラフラグが適用されるように、クリーンなビルドディレクトリを使用するか、先に CMakeCache.txt を削除してください。

参照 Issue #682
トラブル対応
空の Binary に対して YAML::Binary::data() を呼び出すと発生する Clang UBSan の "reference binding to null pointer" エラーはどうすれば修正できますか?

yaml-cpp を issue #1248 の修正を含むリリースにアップグレードするか、リンクされている PR を適用してください。この未定義動作は、内部の std::vector が空のときに &m_data[0] が評価されることが原因です。これを、空のベクターに対しても有効な std::vector::data() に置き換えてください:

char* data() { return m_data.data(); }
const char* data() const { return m_data.data(); }

一時的なローカルでの回避策として、古いコードをガードすることもできます:

return m_data.empty() ? nullptr : &m_data[0];

変更後、yaml-cpp とプロジェクトをリビルドしてください。

参照 Issue #1248
トラブル対応
静的にリンクされた MFC プロジェクトとリンクできるように、yaml-cpp を静的 MSVC ランタイム (/MT) でビルドするにはどうすればよいですか?

共有MSVCランタイムを無効にして、yaml-cppをスタティックライブラリとしてビルドします:

cmake -S . -B build -DYAML_BUILD_SHARED_LIBS=OFF -DYAML_MSVC_SHARED_RT=OFF
cmake --build build --config Release

Debugビルドの場合は--config Debugを使用します。CMakeが/MTdを選択します。

YAML_MSVC_SHARED_RTがデフォルトでONになっている古いバージョンのyaml-cppでは、明示的にOFFに設定してください。または、生成された各Visual Studioプロジェクトで、プロジェクトのプロパティ → C/C++ → コード生成 → ランタイム ライブラリを、Releaseの場合はマルチスレッド (/MT)、Debugの場合はマルチスレッド デバッグ (/MTd)に設定します。

スタティックライブラリを使用する側では、ターゲットに対してYAML_CPP_STATIC_DEFINEを定義します:

target_compile_definitions(myapp PRIVATE YAML_CPP_STATIC_DEFINE)
target_link_libraries(myapp PRIVATE yaml-cpp)

または、Visual Studioプロジェクトのプリプロセッサ定義にYAML_CPP_STATIC_DEFINEを追加します。リンカーの競合を避けるため、yaml-cppとMFCアプリケーションで同じランタイムライブラリ設定を使用していることを確認してください。

参照 Issue #1354
トラブル対応
入力のstd::istreamにfailbitまたはbadbitがセットされている場合に、yaml-cppのYAML::Loadに例外をスローさせるにはどうすればよいですか?

issue #408 の修正を含む yaml-cpp のバージョンにアップグレードしてください。YAML::Load と YAML::LoadAll は、すでに失敗状態にあるストリームを拒否し、パース中に発生したストリームの失敗を伝播するようになりました。一方、空または EOF のみのストリームは、引き続き null ノードを生成するか、ドキュメントを生成しません。古いバージョンでは、パースの前にストリーム例外を有効にしてください:

stream.exceptions(std::ios::failbit | std::ios::badbit);
try {
    YAML::Node node = YAML::Load(stream);
} catch (const std::ios::failure& e) {
    // Handle failed or unreadable input stream.
}

ストリームがすでに失敗状態にある可能性がある場合は、最初にチェックも行ってください:

if (!stream) {
    throw std::runtime_error("input stream is already in a failed state");
}

参照 Issue #408
トラブル対応
Windowsでpkg-configを使用してyaml-cppを静的にリンクする際に未定義シンボルを修正する方法

静的な pkg-config メタデータは、yaml-cpp ヘッダーが静的シンボル宣言を使用するように、YAML_CPP_STATIC_DEFINE を定義する必要があります。修正を含む yaml-cpp リリースにアップグレードするか、インストール済みの yaml-cpp.pc ファイルに次の行を手動で追加してください:

Cflags.private: -DYAML_CPP_STATIC_DEFINE

その後、pkg-config を --static オプション付きで使用します。例:

pkg-config --static --cflags yaml-cpp
pkg-config --static --libs yaml-cpp

即時の回避策として、プロジェクトを -DYAML_CPP_STATIC_DEFINE 付きでコンパイルしてください。この define は静的ビルドでのみ使用すべきであり、共有ビルドの pkg-config 出力に含めてはいけません。

参照 Issue #1345