我正在为树莓派配置一个项目,并且遇到了我不理解的链接错误。
实际上,我交叉编译了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(使用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如何无法引用为我的rapsi安装在raspi上的符号? 我试图在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
..................
感谢您抽出宝贵的时间阅读并为我提供帮助。
答案 0 :(得分:0)
在我粗鲁的版本上,glibc版本是
您的问题与GLIBC无关。关于libstdcxx
。
我不明白opengl如何无法引用已安装的符号
目标系统上安装的内容无关紧要。重要的是要在主机上链接的库。
从GCC ABI table中,您可以知道GLIBCXX_3.4.25
首先是在GCC-8.0.0中定义的,并且(或更高版本)是用来构建{{1}的GCC版本}。
但是,您正在尝试将此库与libopenmpt.so.0
链接,并与 随附的gcc-7.4.1
链接。由于 that libstdc++.so.6
未定义所需的符号,因此链接失败。
您需要使用7.4.1编译器从源代码重建libstdc++.so.6
,或升级到gcc-8.0.0(或更高版本)的编译器。
P.S。 libopenmpt
是弄清楚库中定义了哪些版本的错误方法。请改用strings
。
答案 1 :(得分:0)
因此是编译器版本的原因,有两种选择:
我在以下位置创建了一个新期刊: Missing crt1.o/crti.o for cross compilation