交叉编译GLIBCXX版本链接错误 [英] Cross compilation GLIBCXX version link error

查看:0
本文介绍了交叉编译GLIBCXX版本链接错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为覆盆子配置项目,但我面临一个我无法理解的链接错误。

上下文:

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

问题:

当我尝试编译简单的main.cpp时,链接器在链接OpenCV库时失败:

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

在我粗糙的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不能引用它安装在我的RASPI上的符号作为我的RAPSI? 我尝试在raspi上编译这段代码,所有链接都正确无误。 我错过了什么?

附件: 命令失败

~/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

继续

推荐答案

在我粗糙的glibc版本上

您的问题与GLIBC无关。是关于libstdcxx的。

我不明白OpenGL为什么不能引用它已安装的符号

目标系统上安装了什么并不重要。重要的是您要链接到主机上的哪些库。

GCC ABI table可以看出,GLIBCXX_3.4.25最早是在GCC-8.0.0中定义的,该版本(或更高版本)是用于构建libopenmpt.so.0的GCC版本。

但是,您正在尝试将此库与gcc-7.4.1链接,并与一起提供的libstdc++.so.6链接。由于libstdc++.so.6没有定义所需符号,因此您的链接失败。

您需要使用7.4.1版编译器从源重新生成libopenmpt,或者升级到GCC-8.0.0(或更高版本)。

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

这篇关于交叉编译GLIBCXX版本链接错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆