Cpp(十一) yaml-cpp的使用

本文详细介绍了在Mac环境中通过git克隆、Cmake构建并使用YamlCpp库处理yaml文件的方法,包括静态和动态库的选择,以及在Cmake配置文件中集成和调用库的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

YamlCpp

#1 环境

macOS 10.15.5
Cmake 

#2 安装

git clone git@gitee.com:Coxhuang/yaml-cpp.git
cd yaml-cpp
mkdir build
cd build
# 二选一
# 静态库 
cmake ..
# 动态库
cmake ..  -DBUILD_SHARED_LIBS=ON
make 
sudo make install

安装后,库文件和头文件路径:

头文件: /usr/local/include/yaml-cpp

库文件: /usr/local/lib/libyaml-cpp.a

#3 使用

#3.1 Cmake配置文件

cmake_minimum_required(VERSION 3.17)
project(yaml_demo)

set(CMAKE_CXX_STANDARD 14)

include_directories(/usr/local/include)

find_package (PkgConfig REQUIRED)
pkg_check_modules(YAMLCPP REQUIRED yaml-cpp) # 查找yaml-cpp 

link_directories(
    ${YAMLCPP_LIBRARY_DIRS} # 添加yaml-cpp库文件路径 
)

add_executable(yaml_demo main.cpp)

target_link_libraries(yaml_demo
    ${YAMLCPP_LIBRARIES} # 将yaml-cpp库连接到yaml_demo可执行文件中 
)

#3.2 使用

  • 新建yaml文件
name: Cox
sex: male
age: 18

skills:
  C++: 1
  Python: 1
  • 使用
#include <iostream>
#include "yaml-cpp/yaml.h"

int main() {
    YAML::Node config = YAML::LoadFile("../config.yaml");
    std::cout << "name:" << config["name"].as<std::string>() << std::endl;
    std::cout << "sex:" << config["sex"].as<std::string>() << std::endl;
    std::cout << "age:" << config["age"].as<int>() << std::endl;

    for (auto foo : config["skills"]) {
        std::cout << foo.first.as<std::string>() << ":" << foo.second.as<bool>() << std::endl;
    }

    return 0;
}

输出:

name:Cox
sex:male
age:18
C++:1
Python:1
<think>我们正在解决的问题是:如何根据find命令的结果设置CMake中的CMAKE_PREFIX_PATH以定位yaml-cpp库。 用户已经尝试过使用find命令查找yaml-cpp的路径,现在希望将这些路径用于CMake配置。 思路: 1. 使用find命令找到yaml-cpp的安装路径(包括头文件和库文件路径)。 2. 将这些路径设置为CMake变量,特别是设置CMAKE_PREFIX_PATH,因为CMake在查找包时会搜索该变量指定的路径。 3. 在CMakeLists.txt中使用find_package(yaml-cpp REQUIRED)来定位库。 注意:CMAKE_PREFIX_PATH是一个分号分隔的路径列表,类似于环境变量PATH。设置它可以让CMake在这些路径下查找包。 步骤详解: 步骤1:查找yaml-cpp的安装路径 我们可以使用以下命令查找yaml-cpp的安装路径(假设是Ubuntu系统): - 查找头文件路径(例如:yaml.h所在的目录,通常是yaml-cpp的父目录): find / -name yaml.h 2>/dev/null | grep yaml-cpp 例如输出:/usr/include/yaml-cpp/yaml.h 那么头文件所在目录为:/usr/include - 查找库文件路径(例如:libyaml-cpp.so所在的目录): find / -name 'libyaml-cpp*' 2>/dev/null 例如输出:/usr/lib/x86_64-linux-gnu/libyaml-cpp.so.0.8.0 那么库文件所在目录为:/usr/lib/x86_64-linux-gnu 步骤2:设置CMAKE_PREFIX_PATH 在CMake中,我们可以将找到的路径(头文件和库文件的父目录)添加到CMAKE_PREFIX_PATH中。但是注意,通常我们设置CMAKE_PREFIX_PATH为根路径,CMake会在这些路径的子目录中搜索(如<prefix>/include, <prefix>/lib等)。 因此,我们可以将头文件所在目录的父目录(即/usr)和库文件所在目录的父目录(即/usr/lib/x86_64-linux-gnu的父目录,即/usr)添加到CMAKE_PREFIX_PATH。实际上,由于yaml-cpp通常安装在系统目录(如/usr或/usr/local),这些路径默认就在CMake的搜索路径中。但如果我们安装在其他自定义路径,就需要设置。 例如,如果我们通过源码安装到/opt/yaml-cpp,那么我们可以将/opt/yaml-cpp添加到CMAKE_PREFIX_PATH。 步骤3:在CMakeLists.txt中设置 有两种方式设置CMAKE_PREFIX_PATH: a. 在CMake命令行中设置: cmake -DCMAKE_PREFIX_PATH=/path/to/yaml-cpp/root ... b. 在CMakeLists.txt中设置(不推荐,因为会硬编码路径): set(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH};/path/to/yaml-cpp/root") 步骤4:使用find_package 在CMakeLists.txt中,使用: find_package(yaml-cpp REQUIRED) target_link_libraries(your_target PRIVATE yaml-cpp) 如果CMake无法自动找到,我们还可以通过设置变量来指定路径: set(yaml-cpp_DIR "/path/to/yaml-cpp/lib/cmake/yaml-cpp") find_package(yaml-cpp REQUIRED) 注意:yaml-cpp_DIR应该是包含yaml-cpp-config.cmake或yaml-cppConfig.cmake文件的目录。 示例: 假设我们通过find命令发现yaml-cpp安装在/opt/yaml-cpp,那么: - 头文件在:/opt/yaml-cpp/include - 库文件在:/opt/yaml-cpp/lib - 配置文件在:/opt/yaml-cpp/lib/cmake/yaml-cpp 那么我们可以这样设置: cmake -DCMAKE_PREFIX_PATH=/opt/yaml-cpp ... 或者,如果知道具体的配置文件目录,也可以设置: cmake -Dyaml-cpp_DIR=/opt/yaml-cpp/lib/cmake/yaml-cpp ... 如果yaml-cpp是通过系统包管理器安装的,通常不需要设置CMAKE_PREFIX_PATH,因为CMake会默认搜索系统路径。 但是,如果用户使用find命令找到了非系统路径的yaml-cpp,那么就需要按照上述方法设置。 总结步骤: 1. 使用find命令定位yaml-cpp的安装路径(特别是头文件和库文件路径)。 2. 确定yaml-cpp的根目录(即包含include和lib的目录)或者包含CMake配置文件的目录(通常在lib/cmake/yaml-cpp下)。 3. 在运行CMake时,通过-DCMAKE_PREFIX_PATH=...指定根目录,或者通过-Dyaml-cpp_DIR=...指定配置文件目录。 注意:如果yaml-cpp没有提供CMake配置文件(例如,旧版本可能没有),那么我们就不能使用find_package,而是直接包含头文件和链接库,例如: include_directories(/path/to/yaml-cpp/include) link_directories(/path/to/yaml-cpp/lib) target_link_libraries(your_target PRIVATE yaml-cpp) 但是推荐使用find_package,因为更规范。 根据引用[1]:在CMakeLists.txt中链接yaml-cpp只需要: target_link_libraries(你的可执行文件名称 ${catkin_LIBRARIES} yaml-cpp) 但是前提是find_package已经成功找到了yaml-cpp。 因此,我们的重点是如何让find_package找到yaml-cpp,即设置正确的路径。 下面是一个完整的示例: 假设我们通过find命令发现yaml-cpp安装在/home/user/custom_install/yaml-cpp,那么: 在命令行中运行CMake时: cmake -DCMAKE_PREFIX_PATH=/home/user/custom_install/yaml-cpp ... 或者在CMakeLists.txt中(在find_package之前): set(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH};/home/user/custom_install/yaml-cpp") 然后: find_package(yaml-cpp REQUIRED) 如果还是找不到,可以尝试直接设置yaml-cpp_DIR: set(yaml-cpp_DIR "/home/user/custom_install/yaml-cpp/lib/cmake/yaml-cpp") find_package(yaml-cpp REQUIRED) 最后,链接到目标: target_link_libraries(your_target PRIVATE yaml-cpp) 注意:在设置yaml-cpp_DIR时,路径必须包含yaml-cpp的CMake配置文件(如yaml-cpp-config.cmake)。 如果用户不知道配置文件的位置,可以使用: find / -name "yaml-cpp-config.cmake" 2>/dev/null 来查找。 根据引用[4]:在Ubuntu中可以通过sudo apt-get install libyaml-cpp-dev安装,这样安装后通常不需要额外设置。 因此,如果用户是在非标准位置安装了yaml-cpp,才需要手动设置路径。 总结: 1. 如果yaml-cpp安装在标准系统路径(如/usr, /usr/local),则不需要设置CMAKE_PREFIX_PATH。 2. 如果安装在自定义路径,则设置CMAKE_PREFIX_PATH为该路径(包含include和lib的目录)或者设置yaml-cpp_DIR为包含配置文件的目录。 最后,我们可以通过查看CMakeCache.txt或CMake的输出信息来确认是否找到了yaml-cpp。</think>根据 `find` 命令的结果设置 `CMAKE_PREFIX_PATH` 来定位 yaml-cpp 库,请按以下步骤操作: ### 📌 步骤 1:查找 yaml-cpp 的安装路径 首先使用 `find` 命令确定库的安装位置: ```bash # 查找头文件路径 sudo find / -name yaml.h 2>/dev/null | grep yaml-cpp # 查找库文件路径 sudo find / -name 'libyaml-cpp*' 2>/dev/null ``` 典型输出: ``` /usr/local/include/yaml-cpp/yaml.h # 头文件 /usr/local/lib/libyaml-cpp.so.0.8.0 # 动态库 ``` ### ⚙ 步骤 2:提取根目录路径 从输出中提取根目录(去掉末尾的 `/include/yaml-cpp` 或 `/lib`): ```bash # 示例路径 头文件路径:/usr/local/include/yaml-cpp/yaml.h → 根目录:/usr/local 库文件路径:/usr/local/lib/libyaml-cpp.so → 根目录:/usr/local ``` ### 🔧 步骤 3:设置 CMake 变量 在 `CMakeLists.txt` 中设置路径(**二选一**): #### 方法 A:直接指定路径(硬编码) ```cmake # 在 find_package 前设置 set(yaml-cpp_DIR "/usr/local/lib/cmake/yaml-cpp") # 配置文件目录 # 或 set(CMAKE_PREFIX_PATH "/usr/local") # 根目录 ``` #### 方法 B:通过命令行参数动态设置(推荐) ```bash cmake -B build -Dyaml-cpp_DIR="/usr/local/lib/cmake/yaml-cpp" # 或 cmake -B build -DCMAKE_PREFIX_PATH="/usr/local" ``` ### 📝 步骤 4:完整 CMakeLists.txt 示例 ```cmake cmake_minimum_required(VERSION 3.10) project(MyProject) # 设置路径(如果未通过命令行设置) if(NOT DEFINED yaml-cpp_DIR) set(yaml-cpp_DIR "/usr/local/lib/cmake/yaml-cpp") # 替换为你的路径 endif() find_package(yaml-cpp REQUIRED) # 查找库 add_executable(my_app main.cpp) target_link_libraries(my_app PRIVATE yaml-cpp) # 链接库[^1] ``` ### 💡 关键说明 1. **路径优先级**: ```mermaid graph LR A[命令行参数] -->|最高优先级| B[CMakeLists.txt 中的设置] B --> C[系统默认路径 /usr /usr/local] ``` 2. **验证路径是否生效**: ```cmake find_package(yaml-cpp REQUIRED) message(STATUS "Found yaml-cpp at: ${yaml-cpp_DIR}") ``` 3. **路径类型对比**: | 设置方式 | 适用场景 | 示例值 | |-------------------------|-----------------------------------|---------------------------------| | `yaml-cpp_DIR` | 直接指向 CMake 配置文件目录 | `/usr/local/lib/cmake/yaml-cpp` | | `CMAKE_PREFIX_PATH` | 指向安装根目录(自动搜索子目录) | `/usr/local` | | `CMAKE_LIBRARY_PATH` | 仅指定库文件路径 | `/usr/local/lib` | | `CMAKE_INCLUDE_PATH` | 仅指定头文件路径 | `/usr/local/include` | > ⚠️ **注意**:若 yaml-cpp 是通过系统包管理器安装的(如 `apt install libyaml-cpp-dev`),通常无需手动设置路径,CMake 会自动在标准路径查找[^4]。 ### 🌐 多路径设置 如需添加多个搜索路径: ```cmake set(CMAKE_PREFIX_PATH "/opt/yaml-cpp;/usr/local;$ENV{HOME}/libs") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值