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

无法更新GCC时,编译Kaldi依赖openfst遇<string_view>缺失错误的解决方法

编译Kaldi时OpenFST因<string_view>报错的解决方案(GCC 6.3无法更新)

问题描述

在Kaldi/tools目录下执行make编译时,OpenFST 1.8.4编译失败,核心报错为找不到<string_view>头文件。当前使用的GCC版本为gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516,且无法升级该版本。

报错详情:

compat.cc:22:23: fatal error: string_view: No such file or directory
 #include <string_view>
                       ^
compilation terminated.
Makefile:473: recipe for target 'compat.lo' failed
make[3]: *** [compat.lo] Error 1
make[3]: Leaving directory '/tools/kaldi/tools/openfst-1.8.4/src/lib'
Makefile:370: recipe for target 'install-recursive' failed
make[2]: *** [install-recursive] Error 1
make[2]: Leaving directory '/tools/kaldi/tools/openfst-1.8.4/src'
Makefile:419: recipe for target 'install-recursive' failed
make[1]: *** [install-recursive] Error 1
make[1]: Leaving directory '/tools/kaldi/tools/openfst-1.8.4'
Makefile:64: recipe for target 'openfst_compiled' failed
make: *** [openfst_compiled] Error 2

验证测试结果:

mkhelfi1@b01:/tools/kaldi/tools$ echo '#include <string_view>
> int main() { std::string_view s("test"); return 0; }' > test_sv.cpp
mkhelfi1@b01:/tools/kaldi/tools$ g++ -std=c++17 test_sv.cpp -o test_sv
test_sv.cpp:1:23: fatal error: string_view: No such file or directory
 #include <string_view>
                       ^
compilation terminated.

解决方案

方案一:降低OpenFST版本(推荐)

OpenFST 1.8.x系列开始依赖C17标准的<string_view>,而GCC 6.3仅支持C17的早期草案(-std=c++1z),且未将<string_view>纳入标准库头文件,因此降级到兼容C++11/14的OpenFST版本是最稳妥的方案。

操作步骤:

  • 进入Kaldi/tools目录,删除现有OpenFST文件:
    rm -rf openfst-1.8.4 openfst-1.8.4.tar.gz
    
  • 编辑tools/Makefile,找到OPENFST_VERSION变量,将其值修改为1.7.2
  • 重新执行编译:
    make
    

兼容性说明:Kaldi官方对OpenFST 1.7.x版本有完善的支持,不会引发后续编译或运行时的兼容性问题,是旧版本GCC环境下的标准适配方案。

方案二:修改OpenFST源码适配GCC 6.3(不推荐)

如果必须使用OpenFST 1.8.4,可以通过修改源码适配GCC 6.3的C++17支持:

  • 打开openfst-1.8.4/src/lib/compat.cc,将#include <string_view>替换为#include <experimental/string_view>
  • 将文件中所有std::string_view替换为std::experimental::string_view
  • 在编译OpenFST时添加编译参数:-std=c++1z -D_GLIBCXX_USE_CXX11_ABI=1

缺点:需要修改多处源码,后续Kaldi其他模块可能出现类似兼容性问题,维护成本较高,仅作为临时应急方案。

内容的提问来源于stack exchange,提问作者KHELFI Mohammed Akram

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 16:43:11