C++中使用yaml配置文件

1. 安装yaml-cpp

首先安装yaml-cpp库,可以参照这篇文章
git clone https://github.com/jbeder/yaml-cpp.git
编译yaml-cpp

1. cd yaml-cpp
2. mkdir build 
3. cd build
4. cmake ..
5. make
6. make install
1.1 坑1

要注意yaml-cpp的版本,0.5.2版本与1.2版本,有接口会不一样,版本用错的话会报错。目前来说,我使用的是0.5.2版本。

1.2 坑2

用上面的cmake ..,有可能安装后只有.a静态库。可以用以下命令查看:

cd /usr
sudo find -name *yaml-cpp*

如果没找到.so动态库,而你又必须用动态库,那么安装时要把

cmake ..

改为

cmake -DBUILD_SHARED_LIBS=ON ..
2. 检查yaml-cpp是否已安装

在/usr/lib/下搜索yaml-cpp,若找到则表明已成功安装。
最好让.so或者.a,在/usr/local/lib/usr/lib下都存在,没有的话就从另一个复制过去。
注意看/usr/local/include或者/usr/include有没有yaml-cpp文件夹。

3. C++ example
test.h
#ifndef TEST_H_
#define TEST_H_
#include <iostream> 
#include <yaml-cpp/yaml.h>
template <typename T>
void operator>>(const YAML::Node& node, T& i); 
double test_param1;
double test_param2;
#endif //TEST_H_
test.cpp
#include "test.h"
template <typename T>
void operator>>(const YAML::Node& node, T& i) {
i = node.as<T>();
};
using namespace std;
void loadYamlFile(std::string name){
  YAML::Node node = YAML::LoadFile(name);
  node["test_param1"] >> test_param1;
  node["test_param2"] >> test_param2;
  
  cout << test_param1 << endl;
  cout << test_param2 << endl;
}

int main()
{
  loadYamlFile("./test.yaml");
  return 0;
}
test.yaml
test_param1: 10
test_param2: 20
编译

g++ test.cpp -lyaml-cpp -o test

执行

./test

结果
10
20
4.example解析

须在.h中include相关标准库

#include <yaml-cpp/yaml.h>

固定格式,套入即可

template <typename T>
void operator>>(const YAML::Node& node, T& i); 

相应的,在.cpp中也是固定格式

template <typename T>
void operator>>(const YAML::Node& node, T& i) {
i = node.as<T>();
};
void loadYamlFile(std::string name)//函数名自己定义
{
  YAML::Node node = YAML::LoadFile(name);//使用yaml库的关键
  node["test_param1"] >> test_param1;
  //".yaml文件中的参数名" >> .cpp文件中的参数名;
  //意思是把.yaml中的参数值传给.cpp;一般取同名。
  node["test_param2"] >> test_param2;
}
  loadYamlFile("./test.yaml");
  //yaml文件路径,需要注意,可以使用绝对路径/home/$USER/.../.yaml
  //或者~/.../.yaml
5.在ROS中使用yaml

在ROS中使用,需要对CMakeLists.txt修改,增加yaml-cpp库,且使用一个roslib的package,设置yaml文件的路径。

CMakeLists.txt
link_libraries(    yaml-cpp)
find_package(catkin REQUIRED COMPONENTS
  roslib
)
.h
#include <ros/package.h> 
  std::string dir_package, dir_package_file;
  dir_package = ros::package::getPath("xxx");
  dir_package_file = dir_package + "/config/test.yaml"; 

  loadYamlFile(dir_package_file); 
PS

.yaml文件要放在执行程序的空间中,编译程序的空间中不需要,算是一个小小的坑要注意。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值