编译C++17依赖GTK/glibmm程序遇异常规范错误,求编译器flag方案
问题
编译基于C++17标准、依赖GTK和glibmm的程序时,出现如下错误:
/usr/include/glibmm-2.4/glibmm/variant.h:498:1: error: ISO C++17 does not allow dynamic exception specifications 498 | throw(std::bad_cast)
尝试用以下代码修补variant.h文件作为临时解决方法:
#if __cplusplus >= 201703L #define throw(...) #endif
但引发了更多与throw相关的glib宏定义错误,想请教是否可以通过传递编译器flag来解决该问题?
解决方法
可以通过传递编译器flag解决这个问题,提供两种可行方案:
方案一:使用
-fpermissive编译选项
该选项会放宽编译器对C标准的严格检查,将不符合C17标准的动态异常规范代码转为警告而非错误,从而让编译通过。注意这是临时妥协方案,可能会掩盖其他潜在的代码问题。方案二:降级C标准到C14
如果项目对C17特性依赖不强,编译时添加-std=c++14选项,以C14标准编译。动态异常规范在C++14中虽被标记为废弃,但仍允许使用,可直接规避该错误。
若必须使用C17,优先选方案一;若项目兼容C14,方案二更稳妥。另外,建议检查glibmm版本,更新到2.56及以上版本(该版本开始对C++17支持更完善),从根源解决问题。
内容的提问来源于stack exchange,提问作者no more sigsegv
相关产品推荐
相关产品推荐

