AstroSat任务SXT软件编译报错求助(C++17动态异常规范不兼容问题)
嗨,我刚处理过老C++代码适配新编译器的类似问题,给你几个能解决这个报错的可行思路:
修改编译器的C++标准版本
报错的核心原因是C17标准彻底移除了动态异常规范(也就是代码里的throw(std::invalid_argument)这种写法),而你的编译器默认用了C17或更高版本编译。你可以在编译命令里指定兼容的旧标准,比如C14:
找到Makefile里的编译参数部分,把原命令里的g++ -c -Wno-deprecated -w -pthread改成g++ -c -std=c++14 -Wno-deprecated -w -pthread,或者直接在现有的CXXFLAGS变量里添加-std=c++14参数。如果C14还是有问题,也可以试试-std=c++03,这个标准完全支持动态异常规范。修改log4cpp头文件中的异常声明
如果不想改编译标准,也可以直接修复报错的代码:找到报错的那几个log4cpp头文件(../../include/log4cpp/Priority.hh、../../include/log4cpp/Category.hh),定位到对应的行(比如Priority.hh第107行,Category.hh第116、150行),把throw(std::invalid_argument)这部分直接删掉就行。C++17及之后的标准中,函数如果没有noexcept声明,默认就允许抛出任何异常,删掉这部分不会影响原代码的异常抛出逻辑,只是去掉了被废弃的语法。谨慎升级log4cpp版本(可选)
如果你的SXT软件对log4cpp的版本没有强依赖,可以尝试升级到支持C++17的新版log4cpp,新版库已经移除了这些废弃的动态异常规范写法。不过要注意,老项目可能依赖旧版log4cpp的某些接口,升级前最好先做个备份测试。
备注:内容来源于stack exchange,提问作者merin

