当前位置:   article > 正文

C++中使用yaml配置文件_yaml-cpp 写 list

yaml-cpp 写 list
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
  • 2
  • 3
  • 4
  • 5
  • 6
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*
  • 1
  • 2

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

cmake ..
  • 1

改为

cmake -DBUILD_SHARED_LIBS=ON ..
  • 1
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_
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
test.yaml
test_param1: 10
test_param2: 20
  • 1
  • 2
编译

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

执行

./test

结果
10
20
  • 1
  • 2
4.example解析

须在.h中include相关标准库

#include <yaml-cpp/yaml.h>
  • 1

固定格式,套入即可

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

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

template <typename T>
void operator>>(const YAML::Node& node, T& i) {
i = node.as<T>();
};
  • 1
  • 2
  • 3
  • 4
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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  loadYamlFile("./test.yaml");
  //yaml文件路径,需要注意,可以使用绝对路径/home/$USER/.../.yaml
  //或者~/.../.yaml
  • 1
  • 2
  • 3
5.在ROS中使用yaml

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

CMakeLists.txt
link_libraries(    yaml-cpp)
  • 1
find_package(catkin REQUIRED COMPONENTS
  roslib
)
  • 1
  • 2
  • 3
.h
#include <ros/package.h> 
  • 1
  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); 
  • 1
  • 2
  • 3
  • 4
  • 5
PS

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/274737
推荐阅读
相关标签
  

闽ICP备14008679号