使用devtoolset-8编译Azure Speech C++示例遇依赖缺失问题
解决devtoolset-8编译Azure语音示例的GLIBCXX版本依赖问题
核心原因
Azure语音SDK预编译的libMicrosoft.CognitiveServices.Speech.core.so由更高版本GCC编译,依赖的GLIBCXX版本高于devtoolset-8提供的版本,导致链接阶段出现符号缺失错误。
可行解决办法
1. 重新编译Azure语音SDK核心库
放弃预编译SDK包,下载源码用devtoolset-8重新编译:
- 克隆SDK源码仓库到本地
- 执行
scl enable devtoolset-8 "cmake -S . -B build -DCMAKE_BUILD_TYPE=Release"配置编译环境 - 运行
scl enable devtoolset-8 "cmake --build build"完成核心库编译 - 用自行编译的
libMicrosoft.CognitiveServices.Speech.core.so替换原预编译库,再编译项目
2. 强制静态链接标准库
在Makefile的链接参数中添加-static-libstdc++,规避动态库版本不匹配问题:
- 修改Makefile的LDFLAGS,加入
-static-libstdc++ - 重新执行
scl enable devtoolset-8 "make"编译
3. 升级系统libstdc++库(谨慎操作)
若系统允许,升级libstdc++.so.6至包含GLIBCXX_3.4.22及以上版本的版本:
- 先检查当前库版本:
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX - 从devtoolset-8安装目录(通常为
/opt/rh/devtoolset-8/root/usr/lib64/)复制新版libstdc++.so.6到系统库目录,或创建软链接替换原库 - 注意:此操作可能影响系统内依赖旧版本库的其他程序,需先备份原库文件
4. 用容器隔离编译环境
基于devtoolset-8创建Docker编译容器,在容器内完成编译:
- 编写Dockerfile,以centos7/rhel7为基础镜像,安装devtoolset-8、git、cmake等工具
- 在容器内克隆Azure语音示例与SDK源码,按方法1编译SDK和项目
- 编译完成后导出二进制文件到本地
内容的提问来源于stack exchange,提问作者ZombieHappyBear
相关产品推荐
相关产品推荐

