You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:04:02