有时要编译的程序自带了特定版本的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时就遇到了这样的问题。