【C++】 YAML形式を扱うことができるライブラリ

目次

yaml-cppとは

yaml-cppは,C++でYAML形式のファイルをパースするためのライブラリです.

YAML形式は,​人間が読み書きしやすいデータ形式とされており,​JSONやXMLと同様に​データのシリアライズや設定ファイルの形式としてよく使われています.

YAMLの公式サイトでもyaml-cppが紹介されているので安心して使えると思います.また,​2023/4現在,yaml-cppは,​YAML 1.2仕様に準拠しています.

yaml-cpp以外にもBoostに含まれるBoost.PropertyTreeでYAMLファイルを扱うことができます.

インストール方法

下記の手順でyaml-cppをインストールします.

1. まずyaml-cppをGitHubリポジトリからダウンロードします.


wget https://github.com/jbeder/yaml-cpp/archive/refs/tags/yaml-cpp-0.7.0.tar.gz

2. tarファイルを展開して,ビルド用ディレクトリ(build)を作成します.


tar xvf yaml-cpp-0.7.0.tar.gz
cd yaml-cpp-yaml-cpp-0.7.0
mkdir -p build
cd build

3. ビルドします.


cmake -DCMAKE_INSTALL_PREFIX=/path/to/install -DYAML_BUILD_SHARED_LIBS=on ..
make

ここで,/path/to/installは,yaml-cppをインストールするディレクトリパスに置き換えてください.

4. 念のためテストをしておきます.


make test
Running tests...
Test project /root/yaml-cpp-yaml-cpp-0.7.0/build
    Start 1: yaml-cpp::test
1/1 Test #1: yaml-cpp::test ...................   Passed    0.97 sec

100% tests passed, 0 tests failed out of 1

Total Test time (real) =   0.97 sec

5. インストールします.


make install

使い方

まずは下記のようなYAML形式のファイルを用意します.

config.yml


name: Taro
age: 20
email: taro@example.com

C++のプログラムの例を示します.YAMLをご存知の方は説明しなくても何をやっているかはわかると思います.

main.cpp


#include 
#include 
#include 

int main() {
  // YAMLファイルを読み込む
  YAML::Node config = YAML::LoadFile("config.yaml");

  // パースしたデータを表示する
  std::cout << "name: " << config["name"].as() << std::endl;
  std::cout << "age: " << config["age"].as() << std::endl;
  std::cout << "email: " << config["email"].as() << std::endl;

  return 0;
}

ライブラリリンクを行い,コンパイルします.


g++ main.cpp -I /path/to/yaml-cpp/include -L/path/to/yaml-cpp/lib -lyaml-cpp

実行すると下記のような出力となります.


LD_LIBRAY_PATH=/home/penguin/Desktop/temp/yaml/lib/:${LD_LIBRARY_PATH} ./a.out
name: Taro
age: 20
email: taro@example.com

CMakeでビルドする方法 1

Cmakeを使う一つ目の方法はpkg-configを使う方法です.

まずはCMakeLists.txtを作成します.

CMakeLists.txt


cmake_minimum_required(VERSION 3.5)

# Set the name of the executable to the project name
project(my_project)
set(EXEC_NAME ${PROJECT_NAME})

# Set the path to the YAML-CPP package config file
set(ENV{PKG_CONFIG_PATH} "/home/penguin/Desktop/temp/yaml/share/pkgconfig" $ENV{PKG_CONFIG_PATH})

# Find the YAML-CPP package
find_package(PkgConfig REQUIRED)
pkg_check_modules(YAML_CPP REQUIRED yaml-cpp)

# Create the executable target
add_executable(${EXEC_NAME} main.cpp)

# Add the include directories for the YAML-CPP package
target_include_directories(${EXEC_NAME} PRIVATE ${YAML_CPP_INCLUDE_DIRS})

# Add the link directories for the YAML-CPP package
target_link_directories(${EXEC_NAME} PRIVATE ${YAML_CPP_LIBRARY_DIRS})

# Link the executable with the YAML-CPP library
target_link_libraries(${EXEC_NAME} PRIVATE ${YAML_CPP_LIBRARIES})

ビルドします.


mkdir build
cd build
cmake ..
make

実行すると上記と同じ結果となります.


./my_project
name: Taro
age: 20
email: taro@example.com

CMakeでビルドする方法 2

2つ目の方法は,CMake設定ファイルを編集してCmakeを利用する方法です.

/path/to/yaml-cpp/0.7.0/share/cmake/yaml-cpp/yaml-cpp-config.cmakeを下記のように編集します.

yaml-cpp-config.cmake


# - Config file for the yaml-cpp package
# It defines the following variables
#  YAML_CPP_INCLUDE_DIR - include directory
#  YAML_CPP_LIBRARIES    - libraries to link against

# Compute paths
get_filename_component(YAML_CPP_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
set(YAML_CPP_INCLUDE_DIR "${YAML_CPP_CMAKE_DIR}/../../../include")

# Our library dependencies (contains definitions for IMPORTED targets)
include("${YAML_CPP_CMAKE_DIR}/yaml-cpp-targets.cmake")

# These are IMPORTED targets created by yaml-cpp-targets.cmake
set(YAML_CPP_LIBRARIES "yaml-cpp")

次のようなCMakeLists.txtを作成します.

CMakeLists.txt


cmake_minimum_required(VERSION 3.5)

# Set the name of the executable to the project name
project(my_project)
set(EXEC_NAME ${PROJECT_NAME})

# Set the path to the YAML-CPP package config file
set(CMAKE_PREFIX_PATH ${CMAKE_SOURCE_DIR}/thirdparty/Linux-x86_64/yaml-cpp/0.7.0/share/cmake ${CMAKE_PREFIX_PATH})

# Find the YAML-CPP package
find_package(yaml-cpp REQUIRED)

# Create the executable target
add_executable(${EXEC_NAME} main.cpp)

# Add the include directories for the YAML-CPP package
target_include_directories(${EXEC_NAME} PRIVATE ${YAML_CPP_INCLUDE_DIR})

# Link the executable with the YAML-CPP library
target_link_libraries(${EXEC_NAME} PRIVATE ${YAML_CPP_LIBRARIES})

あとは方法1と同様にビルドします.

よかったらシェアしてね!
目次