交叉编译 GLIBCXX 版本 link 错误

Cross compilation GLIBCXX version link error

我正在为覆盆子配置一个项目,但我遇到了一个我不理解的 linking 错误。

上下文:

实际上,我交叉编译了 Qt,一切正常。 现在,我正试图让 opencv 也能在我的 Qt 应用程序中进行图像处理。 我没有交叉编译 opencv,而是使用 apt install 安装它,并在 ~/raspi/sysroot 中同步了我的目标 sysroot。 为了获得 raspi 相机控制,我使用了 mmal 库(位于 /opt/vc/lib 中的 rpi 上)。 我用 gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf 交叉编译了 Qt,所以 qmake 也在使用它。 Raspi 是 运行 Raspian buster Lite,它使用相当老的 glibc(使用 gcc-linaro-7.4.1 的原因,在 Qt mkspec 文档中推荐)

问题:

当我尝试编译一个简单的 main.cpp 时,link在 linking opencv 库时失败:

~/raspi/sysroot/usr/lib/arm-linux-gnueabihf/libopenmpt.so.0: undefined reference to `std::random_device::_M_getentropy() const@GLIBCXX_3.4.25'

在我的 raspy 上,glibc 版本是

$ strings /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 | grep GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_DEBUG_MESSAGE_LENGTH

问题:

我不明白 opengl 为何无法为我的 rapsi 引用安装在我的 raspi 上的符号? 我试图在 raspi 上正确编译这段代码,并且所有 link 都正确。 我错过了什么?

附件: 命令失败

~/Documents/personal/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ -mfloat-abi=hard --sysroot=~/raspi/sysroot -Wl,-O1 -Wl,-rpath,/usr/local/qt5pi/lib -Wl,-rpath-link,~/raspi/qt5pi/lib -Wl,-rpath-link,~/raspi/sysroot/usr/lib/arm-linux-gnueabihf -Wl,-rpath-link,~/raspi/sysroot/lib/arm-linux-gnueabihf -o photomata main.o   -L~/raspi/sysroot/opt/vc/lib/ -lopencv_core -lopencv_videoio -lopencv_highgui -lraspicam -lmmal -lmmal_core -lmmal_util -lmmal_vc_client -lmmal_components -lvchiq_arm -lvcsm -lcontainers -lvcos -lbcm_host ~/raspi/qt5pi/lib/libQt5MultimediaWidgets.so ~/raspi/qt5pi/lib/libQt5Widgets.so ~/raspi/qt5pi/lib/libQt5Multimedia.so ~/raspi/qt5pi/lib/libQt5Gui.so ~/raspi/qt5pi/lib/libQt5Network.so ~/raspi/qt5pi/lib/libQt5Core.so -L~/raspi/sysroot/usr/lib/arm-linux-gnueabihf -lGLESv2 -lpthread 

.......

感谢您抽出宝贵的时间阅读并帮助我。

问题在 Missing crt1.o/crti.o for cross compilation

继续

On my raspy, glibc version is

你的问题与GLIBC无关。大约 libstdcxx.

I don't understand How opengl can't make reference to a symbol that it is installed

你的目标系统上安装了什么并不重要。重要的是您 link 在 host.

上反对哪些库

GCC ABI table可以看出,GLIBCXX_3.4.25首先在GCC-8.0.0中定义,并且那个(或更高版本)是用于构建libopenmpt.so.0.

但是,您正在尝试 link 这个库 gcc-7.4.1,并反对 这个库。由于 that libstdc++.so.6 没有定义所需的符号,因此您的 link 失败。

您需要使用 7.4.1 编译器从源代码重建 libopenmpt,或者将编译器升级到 gcc-8.0.0(或更高版本)。

P.S。 strings 错误的 方法来确定库中定义了哪些版本。请改用 readelf -V

所以编译器版本有问题,有两种选择:

  • 用gcc-linaro-7.4.1重新编译opencv
  • 使用 >8.0.0 的编译器

我创建了一个新问题: Missing crt1.o/crti.o for cross compilation