编译环境里存在yaml-cpp的多个版本时可能引起的问题

有时要编译的程序自带了特定版本的yaml-cpp,同时系统目录下也安装了更高版本的yaml-cpp,这时可能引起编译错误,就是某些yaml-cpp的API不认识,例如:

出现这种问题倒好办,正常情况下不可能,肯定能猜到是环境里有不同的版本,编译时找的另外的版本,把系统目录里安装的yaml-cpp暂时改名或移走即可。

最折腾人浪费时间的是编译时不报错,运行时发生coredump,检查发现崩溃在yaml-cpp里,例如:

YAML::Node enable_roi_node = config["enable_roi"];
if (enable_roi_node)
    enable_roi_ = enable_roi_node.as<bool>();

上面的代码运行时发生coredump,崩溃在YAML::Node的as<bool>()函数里,看起来这不可思议,正常情况下,这些函数的实现不可能有错,第一次遇到这种问题时总以为yaml-cpp的代码哪里有问题,费劲去读它的代码想找出线索,浪费了不少时间,第二天突然想到是不是环境里存在多个版本的yaml-cpp,编译链接程序时把其它版本的函数实现包含进来了,于是去/usr/include下查看,还真也有个yaml-cpp,版本和项目使用的版本不一样,把这个系统下的yaml-cpp移走,再编译程序后运行就正常了!由于yaml-cpp的实现都是放在头文件里,移走头文件即可。

环境里有多个不同版本的支持库,运行时可能加载了不同版本的库也会引起程序莫名其妙地coredump,这种情况倒是多见,例如opencv里自带了Qt的某些库,程序运行需要Qt库支持的程序时,可能会莫名地崩溃,原因就是系统里也安装了Qt,opencv里也自带了Qt库,这时可以卸载掉系统里的Qt或者通过设置LD_LIBRARY_PATH来避免加载系统环境里的Qt库,就不会发生崩溃了,某次在docker内使用Labelme时就遇到了这样的问题。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arnold-FY-Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值