GCC 8.3.1编译依赖TSDuck 3.27代码时UString.h报erase匹配错误
问题根因
该问题和GCC版本对C11的支持度无关,核心原因是CentOS 7系统默认携带的libstdc标准库存在兼容性缺陷:其对std::basic_string<char16_t>(即std::u16string)的实现并未提供C11标准要求的erase(const_iterator)重载,仅支持接收普通iterator的版本。即便通过devtoolset安装了高版本GCC,默认编译时仍会链接系统自带的旧版libstdc,因此会触发该匹配错误。
可用解决方案
- 方案1:修改TS Duck头文件临时修复
打开路径/usr/include/tsduck/tsUString.h,定位到2088行的erase函数实现,替换为如下代码,手动将const_iterator转为父类支持的iterator即可:
iterator erase(const_iterator position) { return SuperClass::erase(begin() + (position - cbegin())); }
- 方案2:编译时强制链接高版本标准库
使用devtoolset的GCC编译你的业务代码时,添加编译参数-static-libstdc++,静态链接devtoolset自带的新版libstdc++,即可避开系统旧版库的缺陷。 - 方案3:升级TS Duck版本
3.27-2438之后的TS Duck版本已经针对CentOS 7的标准库兼容性做了专门适配,卸载当前RPM包后安装更新版本的TSDuck即可直接解决问题。
内容的提问来源于stack exchange,提问作者jasonlg3d
相关产品推荐
相关产品推荐

