编译Caffe相关代码遇looser throw specifier与overriding错误求助
解决Caffe编译时的
looser throw specifier和overriding错误 先给你把这两个错误的来龙去脉讲明白,再给你可行的解决办法:
错误含义拆解
looser throw specifier错误:C++规定子类重写父类虚函数时,子类函数的异常声明不能比父类更宽松。打个比方,如果父类函数明确标注了noexcept(承诺绝对不会抛出异常),子类重写的函数必须严格遵守这个规则,不能去掉noexcept或者换成允许抛出异常的声明。overriding错误:这是前一个问题的连锁反应——因为Boost子类的name()函数异常声明和标准库父类的不匹配,编译器认为你没有正确重写父类的虚函数,而是定义了一个新函数,所以报错提示覆盖规则冲突。
同时出现的原因
从错误日志能看出,boost::system::error_category::std_category::name()用了BOOST_NOEXCEPT宏,而标准库std::error_category::name()用的是原生noexcept。核心问题是你的Boost版本和GCC 4.9不兼容:GCC 4.9对C++11的noexcept支持更严格,而旧版本Boost的BOOST_NOEXCEPT宏定义和GCC 4.9的noexcept不匹配,导致编译器判定子类的异常声明比父类更宽松,直接触发了这两个错误。
具体解决方法
按推荐程度排序,给你三个可行方案:
1. 升级Boost到兼容GCC 4.9的版本
Boost从1.55版本开始,BOOST_NOEXCEPT宏会根据编译器自动适配为noexcept,完美兼容GCC 4.9。下载对应版本的Boost重新编译安装后,再编译你的代码,这是最彻底的解决方式。
2. 编译时添加宏定义强制统一异常声明
如果暂时没法升级Boost,直接在编译脚本里加一个宏定义,让Boost的异常声明和标准库保持一致。修改你的编译脚本,在nvcc参数中加入-DBOOST_NOEXCEPT=noexcept:
#!/bin/sh source=deep_image_analogy/source nvcc $source/*.cpp $source/*.cu -o demo \ -std=c++11 \ -DBOOST_NOEXCEPT=noexcept \ -I./include \ -L./build/lib \ -lopencv_core \ -lopencv_highgui \ -lopencv_imgproc \ -lboost_system \ -lcublas \ -lcaffe \ -lglog
这个方法不用修改Boost源码,仅通过编译选项修正宏定义,简单有效。
3. 检查Caffe与Boost的版本匹配性
如果你的Caffe是用另一个版本的Boost编译的,而当前链接的Boost版本不一致,也会出现这类ABI不兼容问题。你可以确认Caffe编译时依赖的Boost版本,要么切换到对应版本的Boost,要么重新编译Caffe适配当前的Boost版本。
内容的提问来源于stack exchange,提问作者Kicr
相关产品推荐
相关产品推荐

