qtwebengine:对std::basic_streambuf的未定义引用



我正在Ubuntu 18.04上使用Yocto编译qtwebengine 5.15.2。

我得到以下错误:

[18991/20786] STAMP v8_snapshot/obj/v8/run_gen-regexp-special-case.stamp
[18992/20786] LINK v8_snapshot/torque
FAILED: v8_snapshot/torque
/home/aws-mjamal/test/build-am437x-evm-test/tmp/hosttools/g++ -pie -Wl,--fatal-warnings -Wl,--build-id=sha1 -fPIC -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,-z,defs -Wl,--as-needed -m32 -pie -Wl,--disable-new-dtags -Wl,-O2 -Wl,--gc-sections -o "v8_snapshot/torque" -Wl,--start-group @"v8_snapshot/torque.rsp"  -Wl,--end-group  -ldl -lpthread -lrt
v8_snapshot/obj/v8/torque_base/torque_base_jumbo_3.o:(.data.rel.ro._ZTVN2v88internal6torque13NullStreambufE[_ZTVN2v88internal6torque13NullStreambufE]+0x18): undefined reference to `std::basic_streambuf<char, std::char_traits<char> >::seekoff(long, std::_Ios_Seekdir, std::_Ios_Openmode)'
collect2: error: ld returned 1 exit status
[18993/20786] CXX v8_snapshot/obj/v8/third_party/inspector_protocol/crdtp/crdtp_jumbo_1.o
[18994/20786] CXX v8_snapshot/obj/v8/src/inspector/inspector/inspector_jumbo_1.o
[18995/20786] CXX v8_snapshot/obj/v8/src/inspector/inspector/inspector_jumbo_3.o
[18996/20786] CXX v8_snapshot/obj/v8/src/inspector/inspector/inspector_jumbo_2.o
[18997/20786] CXX v8_snapshot/obj/v8/src/inspector/inspector/inspector_jumbo_4.o
ninja: build stopped: subcommand failed.

首先,seekoff是一个虚拟保护方法。

https://en.cppreference.com/w/cpp/io/basic_streambuf

https://en.cppreference.com/w/cpp/io/basic_streambuf/pubseekoff

  1. 调用最派生类的seekoff(off, dir, which)

  2. 此函数的基类版本不起作用。派生的类可以重写此函数以允许的相对定位位置指示器。

因此,您选择的配置答案选择不构建源文件,其中为该对象实际实现了seekoff。

Qt支持X11与Ubuntu 18.04。https://doc.qt.io/qt-5/linux.html

其他人在Ubuntu 18.04上尝试构建qtwebengine时遇到了问题,因为该平台上的libopus是原生的。

https://askubuntu.com/questions/1355519/opus-1-3-1-on-ubuntu-18-04-w-preinstalled-opus-0-5-2

你没有列出你的牌子,但这是一个供应商的说明。

https://developer.toradex.com/knowledge-base/how-to-set-up-qt-creator-to-cross-compile-for-embedded-linux boot-to-qt-for-embedded-linux

这是你得到的唯一错误吗?

Web引擎是一头野兽。因此,每个人都将它从嵌入式系统项目中删除。你所关注的错误可能与真正的问题无关。众所周知,基于Qt构建的嵌入式系统在构建WebEngine的时候会耗尽内存,尤其是当一个人没有使用-j1来限制单个处理器的时候。每个进程可以消耗8GB。如果您没有将作业数量限制为1,并且拥有4核机器,那么它会尝试使用32GB,而您可能没有。在日志的某个地方,你得到了内存不足的错误,它不是致命的,在那里。

你真的需要qtwebengine还是你只是构建它来构建一切?

几乎每个嵌入式系统都做了这个。https://community.toradex.com/t/apalis-imx8qm-b2qt-qtwebengine-build-error/11441/3

它是一只资源猪。很多嵌入式系统根本没有足够的底层功能来考虑运行它。

所以,下面的一个应该对你有用:

  1. 如果你不需要webengine,在一个干净的目录树中开始一个新的构建,并从配置中删除它。
  2. 如果你真的需要它,在一个干净的目录树中开始一个新的构建,并在make/ninja命令上使用-j1限制一个CPU/线程,这样你就不会耗尽内存。
  3. 赔率是你不会幸运地有torque_base_jumbo_3直接使用seekoff()。Qt喜欢把这样的东西隐藏在隐藏的私有类中。您必须确定哪些对象(如果可以的话)是从std::basic_streambuf派生或包含从std::basic_streambuf派生的内容。对于模板,使用模板有时是不可能的。使用grep(或类似grep的工具)在整个源代码树中查找哪些源文件使用了seekoff()。这应该是一个很小的数字。接下来,搜索构建日志,看看这些文件发生了什么变化。他们都建得很干净吗,还是有些根本就没建?

https://blog.kitware.com/cmake-building-with-all-your-cores/

ninja不需要像GNU make那样使用-j标志来执行并行构建。默认一次构建核心+2个作业

唯一的"快速修复"因为你的问题是,如果你不需要webengine,就把它拿出来,把ninja限制在1。

哦!另外,请查看我发布的X11链接,了解Ubuntu 18.04的最低编译器版本。你可能会被它咬到。

最新更新