Ubuntu安装ymal
1 编译yaml-cpp库
yaml-cpp是github上的一个开源库,通过CMake编译
下载好了,里面有帮助文档,根据帮助文档编译即可
mkdir build
cd build
cmake ..
make
make install
2 demo测试
编写一个demo文件,创建一个config.yaml配置文件
name: Randy
Tel: 18666666
age: 18
languages:
- Ruby
- Perl
- Python
skills:
c++: 1
java: 1
android: 1
python: 1
label:
QQ: hello
cc: world
JJ: QCJ
containers:
- name: hh
age: 18
- name: kk
age: 12
- name: yy
age: 30
rotations:
[2,3,4,5,6,7,8]
main.cpp内容:
#include <iostream>
#include <string>
#include "ymal-cpp/yaml.h"
#include <fstream>
class Containers
{
public:
std::string m_name;
int m_age;
static std::vector<Containers> YamlToContainers(YAML::Node& node)
{
std::vector<Containers> containers;
for (auto it = node["containers"].begin(); it != node["containers"].end(); it++)
{
Containers container;
container.m_name = it->operator[]("name").as<std::string>();
container.m_age = it->operator[]("age").as<int>();
containers.push_back(container);
}
return containers;
}
std::string ToString(Containers container)
{
std::stringstream ss;
ss << "name: " << container.m_name << '\n' << "age: " << container.m_age << '\n';
return ss.str();
}
};
int main(int argc, char** argv)
{
YAML::Node config = YAML::LoadFile("/home/qiancj/Vmware16/ShareFolder/5Codes/yaml_demo/config.yaml");
std::cout << "name:" << config["name"].as<std::string>() << std::endl;
std::cout << "Tel:" << config["Tel"].as<std::string>() << std::endl;
std::cout << "age:" << config["age"].as<int>() << std::endl;
std::cout << "skills:" << config["skills"]["c++"].as<int>() << std::endl;
// 读取languages
for (auto it = config["languages"].begin(); it != config["languages"].end(); it++)
{
std::cout << it->as<std::string>() << std::endl;
}
// 读取label
for (auto it = config["label"].begin(); it != config["label"].end(); it++)
{
std::cout << it->first.as<std::string>() << ": " << it->second.as<std::string>() << std::endl;
}
// 读取containers
std::vector<Containers> p_set = Containers::YamlToContainers(config);
for(auto it : p_set)
{
std::cout << it.ToString(it) << std::endl;
}
// 读取list
YAML::Node rot = config["rotations"];
for (YAML::const_iterator it= rot.begin();it!=rot.end();++it) {
std::cout << it->as<int>() << "\n";
}
// 写入yaml
YAML::Node node;
node["Countries"].push_back("China");
node["Countries"].push_back("Russia");
node["Countries"].push_back("Africa");
node["Colors"]["Black"] = "night";
node["Colors"]["Red"] = "sun";
node["Colors"]["Yellow"] = "flower";
node["Colors"]["Green"] = "tree";
std:: cout << node << std::endl;
std::ofstream ofs("config.yaml");
ofs << node;
ofs.close();
return 0;
}
CMakeLists.txt配置如下
project(yaml_demo)
add_definitions(-std=c++11)
include_directories(include)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) # 二进制文件的输出目录
Message(STATUS, "PRINT ${PROJECT_SOURCE_DIR}")
link_directories(${PROJECT_SOURCE_DIR}/lib/yaml-cpp)
add_executable(${PROJECT_NAME} main.cpp)
target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_SOURCE_DIR}/include)
target_link_libraries(${PROJECT_NAME} ${PROJECT_SOURCE_DIR}/lib/yaml-cpp/libyaml-cpp.a)
编译过程中总是报错
/tmp/ccCvErNZ.o: In function `YAML::detail::node& YAML::detail::node_data::get<std::string>(std::string const&, std::shared_ptr<YAML::detail::memory_holder>)':
cricket.cpp:(.text._ZN4YAML6detail9node_data3getISsEERNS0_4nodeERKT_St10shared_ptrINS0_13memory_holderEE[_ZN4YAML6detail9node_data3getISsEERNS0_4nodeERKT_St10shared_ptrINS0_13memory_holderEE]+0x94): undefined reference to `YAML::detail::node_data::convert_to_map(std::shared_ptr<YAML::detail::memory_holder>)'
collect2: error: ld returned 1 exit status
stack overflow上建议直接安装libyaml:
apt-get --build source libyaml-cpp0.5/stable
//or
dpkg -i libyaml-cpp0.5*.deb
还是不行,需要在CMakeLists.txt中添加:
FIND_PACKAGE(yaml-cpp REQUIRED)
再次测试可以运行
且生成了新的yaml文件