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と同様にビルドします.