C++中yaml-cpp头文件内引用的头文件编译器无法找到如何解决
问题原因
核心是头文件搜索路径和引用规则不匹配:
- yaml.h内部所有子头文件引用格式为
#include "yaml-cpp/xxx.h",要求你通过-I指定的头文件搜索根目录下,必须存在名为yaml-cpp的子目录,存放parser.h、emitter.h、node相关头文件。你当前把所有头文件直接放在/home/user/application/libs/yaml-cpp/include根目录下,没有创建yaml-cpp子目录,编译器拼接出的路径/home/user/application/libs/yaml-cpp/include/yaml-cpp/parser.h不存在,因此报错。 - main.cpp中使用相对路径
#include "./lib/yaml-cpp/include/yaml.h"引入头文件,没有利用-I参数的搜索规则,也容易出现路径匹配异常。
你将文件放到/usr/lib64下能正常运行,就是因为系统默认搜索路径下存在符合规则的yaml-cpp子目录结构。
快速验证
执行以下命令即可确认是否为目录结构问题,如果提示文件不存在,就说明结构不符合要求:
ls /home/user/application/libs/yaml-cpp/include/yaml-cpp/parser.h
修复方案
方案一:调整目录结构(推荐,符合官方规范)
- 在
/home/user/application/libs/yaml-cpp/include目录下新建yaml-cpp子目录 - 将parser.h、emitter.h、node目录等除yaml.h之外的所有头文件,全部移动到新建的yaml-cpp子目录中
- 修改main.cpp中的头文件引用为
#include <yaml.h> - 执行编译命令即可,若有链接错误需要补充库文件搜索路径:
# 基础编译命令 g++ -I/home/user/application/libs/yaml-cpp/include main.cpp -lyaml-cpp # 如果yaml-cpp的库文件在/home/user/application/libs/yaml-cpp/lib目录下,使用以下命令 g++ -I/home/user/application/libs/yaml-cpp/include -L/home/user/application/libs/yaml-cpp/lib main.cpp -lyaml-cpp
方案二:修改头文件引用规则(无需调整目录,临时适配)
如果不想改动现有目录结构,可以直接修改yaml.h中的所有引用语句,去掉yaml-cpp/前缀,例如将#include "yaml-cpp/parser.h"改为#include "parser.h",所有内部引用修改完成后,用原编译命令即可编译。
内容的提问来源于stack exchange,提问作者user3702643
相关产品推荐
相关产品推荐

