Ubuntu18.04下Yocto编译QtWebEngine5.15.2报std::basic_streambuf未定义引用错误
Ubuntu 18.04 下 Yocto 编译 QtWebEngine 5.15.2 链接错误解决方案
错误根因
该报错是Ubuntu 18.04原生主机GCC版本(默认7.5)与QtWebEngine 5.15.2内置V8引擎的代码C标准库兼容性问题:V8的torque工具编译时启用了32位模式,其内部NullStreambuf类继承的std::basic_streambuf虚函数签名与主机libstdc提供的实现不匹配,导致链接阶段出现未定义引用。
解决方案
方案1:升级主机GCC版本(优先推荐)
升级主机GCC到9以上版本,解决libstdc++兼容问题:
- 安装GCC 9工具链:
sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt update sudo apt install gcc-9 g++-9
- 配置系统默认GCC/G++为9版本:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 90
- 完全删除Yocto之前的编译缓存目录(build/tmp),重新启动编译即可。
方案2:修改QtWebEngine编译配置(无需修改主机环境)
在Yocto层的qtwebengine_%.bbappend文件中添加如下配置,跳过V8快照的宿主工具编译环节:
EXTRA_QMAKEVARS_PRE += "CONFIG+=webengine-no-build-v8-snapshot"
修改后清理编译缓存重新编译即可,该方案不会影响最终生成的QtWebEngine功能。
方案3:升级Yocto版本
升级Yocto到Dunfell 3.1及以上版本,高版本Yocto已经集成了QtWebEngine 5.15.2的适配补丁,自带的宿主工具链可以直接兼容编译。
注意事项
- 任何配置修改后都需要彻底清理旧的编译缓存,否则旧的编译产物会继续触发相同报错
- 若开启了Yocto的共享状态缓存(SSTATE_CACHE),也需要清理对应QtWebEngine相关的缓存条目
内容的提问来源于stack exchange,提问作者md.jamal
相关产品推荐
相关产品推荐

