交叉编译 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
我正在为覆盆子配置一个项目,但我遇到了一个我不理解的 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