linux - 在 i.MX6 的 Qt5 OpenGL 测试交叉编译期间发现不兼容的 libc.so.6

标签 linux qt linker cross-compiling symlink

我正在尝试为 Freescale i.MX6 处理器交叉编译 Qt5。我已经使用最新的 Yocto 包构建了一个图像。

在编译 qtbase 之前,首先通过编译一些 OpenGL 代码来运行 OpenGL 功能测试。然而,在此测试期间,编译器提示发现了不兼容的 libc.so.6

我在另一篇文章中发现(目前我找不到),发生这样的错误是因为 /lib/libc.so.6 实际上是一个符号链接(symbolic link),它指向到实际的共享对象文件。然而,编译器并没有使用libc.so.6指向的共享目标文件,而是试图链接到符号链接(symbolic link)本身,因此存在兼容性问题。

这是运行 configure 脚本时的输出:

OpenGL ES 2.x auto-detection... ()
/home/Desktop/poky-dylan-9.0.0/build/tmp/sysroots/x86_64-linux/usr/bin/armv7a-vfp-neon-poky-linux-gnueabi/arm-poky-linux-gnueabi-g++ -c -pipe -mfloat-abi=softfp -O2 -O2 -march=armv7-a -mfpu=neon -DLINUX=1 -DEGL_API_FB=1 -Wall -W -fPIE  -I../../../mkspecs/devices/linux-imx6-g++ -I. -I/home/Desktop/poky-dylan-9.0.0/build/tmp/deploy/images/mountpoint/usr/include -o opengles2.o opengles2.cpp
/home/Desktop/poky-dylan-9.0.0/build/tmp/sysroots/x86_64-linux/usr/bin/armv7a-vfp-neon-poky-linux-gnueabi/arm-poky-linux-gnueabi-g++ -Wl,-rpath-link,/home/Desktop/poky-dylan-9.0.0/build/tmp/deploy/images/mountpoint/usr/lib -Wl,-O1 -o opengles2 opengles2.o   -L/home/Desktop/poky-dylan-9.0.0/build/tmp/deploy/images/mountpoint/usr/lib -lGLESv2 -lEGL -lGAL 
/home/Desktop/poky-dylan-9.0.0/build/tmp/sysroots/x86_64-linux/usr/libexec/armv7a-vfp-neon-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/4.7.2/ld: skipping incompatible /lib/libc.so.6 when searching for /lib/libc.so.6
/home/Desktop/poky-dylan-9.0.0/build/tmp/sysroots/x86_64-linux/usr/libexec/armv7a-vfp-neon-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/4.7.2/ld: cannot find /lib/libc.so.6
/home/Desktop/poky-dylan-9.0.0/build/tmp/sysroots/x86_64-linux/usr/libexec/armv7a-vfp-neon-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/4.7.2/ld: skipping incompatible /usr/lib/libc_nonshared.a when searching for /usr/lib/libc_nonshared.a
/home/Desktop/poky-dylan-9.0.0/build/tmp/sysroots/x86_64-linux/usr/libexec/armv7a-vfp-neon-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/4.7.2/ld: cannot find /usr/lib/libc_nonshared.a
/home/Desktop/poky-dylan-9.0.0/build/tmp/sysroots/x86_64-linux/usr/libexec/armv7a-vfp-neon-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/4.7.2/ld: cannot find /lib/ld-linux.so.3
collect2: error: ld returned 1 exit status
gmake: *** [opengles2] Error 1
OpenGL ES 2.x disabled.
The OpenGL ES 2.0 functionality test failed!

这是我用来为 configure 脚本提供正确选项的脚本:

#!/bin/sh
./configure -v -opensource -confirm-license -no-pch -opengl es2 \
        -make libs -device imx6 \
        -make examples -make demos \
        -device-option CROSS_COMPILE=/home/Desktop/poky-dylan-9.0.0/build/tmp/sysroots/x86_64-linux/usr/bin/armv7a-vfp-neon-poky-linux-gnueabi/arm-poky-linux-gnueabi- \
        -sysroot /home/Desktop/poky-dylan-9.0.0/build/tmp/deploy/images/mountpoint -no-gcc-sysroot \
        -prefix /opt/qt5

目前,我正在考虑将实际的共享对象文件重命名为 libc.so.6,但这似乎不是解决问题的好方法。

最佳答案

看来您正在针对错误的 libc 进行编译。正确的 libc 的位置应该是:/home/Desktop/poky-dylan-9.0.0/build/tmp/deploy/images/mountpoint/lib/你能检查一下吗?在该文件夹中运行:

file libc.so.6

看看架构是否正常。我面前没有资源,所以如果出现问题,请提供反馈。

您的应用程序是在 chroot 环境中编译的(参见 man chroot)。文件夹/home/Desktop/poky-dylan-9.0.0/build/tmp/deploy/images/mountpoint 充当您的应用程序的新根文件夹。这是在配置脚本的 -sysroot 选项中配置的。这对 gcc 无效,因为 -no-gcc-sysroot 已打开。所以链接器正在寻找您的 native /lib/文件夹以查找库。他们当然不在那里。

那么,您可以尝试以下操作吗:

1) 删除配置脚本中的 -no-gcc-sysroot 选项。重新配置,尝试制作。

2) 这可能会失败,因为编译器找不到它自己的组件。请将编译器目录挂载到您的 chroot 环境中。运行下一个命令:

mkdir /home/Desktop/poky-dylan-9.0.0/build/tmp/deploy/images/mountpoint/usr/bin -p

mount --bind /home/Desktop/poky-dylan-9.0.0/build/tmp/sysroots/x86_64-linux/usr/bin/ /home/Desktop/poky-dylan-9.0.0/build/tmp/deploy/images/mountpoint/usr/bin

重新配置,再次尝试制作。

3) 如果还是不行,说明交叉编译器没有设置好。更改为配置脚本参数列表 CROSS_COMPILE 参数:

CROSS_COMPILE=/usr/bin/armv7a-vfp-neon-poky-linux-gnueabi/arm-poky-linux-gnueabi-

祝你好运。让我知道它是否有效。

关于linux - 在 i.MX6 的 Qt5 OpenGL 测试交叉编译期间发现不兼容的 libc.so.6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16987623/

相关文章:

Linux命令打印树状目录结构

c++ - 在带有 Qt 的 Linux Ubuntu 平台上使用 OpenCV 2.2 显示图像

QToolButton autoRaise 不适用于 Mac OSX

c++ - Qt QString "key-value"从 QHash 替换

c++ - gcc 链接器找不到库

linux - 如何仅在 awk 中的某些列上运行 if 条件

linux - 如何让终端建议自定义命令的选项?

ios - 带有 Xcode 的 iOS 的链接器标志

linux - 如何阻止sed插入换行符?

c++ - 正确使用静态类成员