不兼容的libc.so.6在i.MX6的Qt5 OpenGL测试交叉编译过程中发现



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

在编译qtbase之前,首先通过编译一些OpenGL代码来运行OpenGL功能测试。但是,在此测试期间,编译器报错找到了不兼容的libc.so.6

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

下面是运行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的位置应该是:/home/desktop/poky-dylan-9.0.0/build/tmp/deploy/images/mountpoint/lib/在该文件夹下运行:

文件libc.so.6

看看架构是否良好。我手头没有资料,所以如果有什么问题,请给我反馈。

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

那么,你可以试试下面的方法:

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

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

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

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参数更改为configure script参数列表:

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

我祝你好运。让我知道它是否工作。

最新更新