1

我正在尝试为飞思卡尔 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,但这似乎不是解决问题的好方法。

4

1 回答 1

4

您似乎正在针对错误的 libc 进行编译。正确的 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 充当应用程序的新根文件夹。这是在配置脚本的 -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 -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/图像/挂载点/usr/bin

再次配置并再次尝试制作。

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

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

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

于 2013-06-10T22:02:12.603 回答