如何在tiny210设备上使用Qt app?

时间:2014-01-08 11:51:42

标签: c++ qt qt4 arm cross-compiling

我想在tiny210 device上使用Qt应用。

我安装了从here下载的Qt(qt-everywhere-opensource-src.4.8.5)。我设法编译了一个在tiny210上使用的简单应用程序。问题是,现在当我尝试在设备上运行应用程序时,出现以下错误:

libc.so.6: version 'GLIBC_2.15' not found (required by libQtCore.so.4)
libc.so.6: version 'GLIBC_2.15' not found (required by libQtNetwork.so.4)

目标设备上的/lib/中有一个libc.so.6,但版本为2.11。

我应该提一下,在收到这些错误之前,由于没有libQtCore.so.4libQtNetwork.so.4libQtGui.so.4,我也遇到了错误。我只是通过将已编译的库从我的主机PC复制到设备来修复这些错误。

第一个问题是:是否有更好的方法来提供所需的库,或者复制它们是否合适?

第二个问题是:如何克服上述错误?

编辑:我已经阅读了有关将其构建为静态的内容,但我不确定如何以及这有什么缺点。

EDIT2:由于无艺术噪音的答案,我设法克服了上述错误,但现在我得到了:error loading shared libraries: libQtGui.so.4: cannot open shared object file: No such file or directory

1 个答案:

答案 0 :(得分:1)

问题是交叉编译器(apt-get install gcc-arm-linux-gnueabi)是基于ARM的,并且此交叉编译器具有比ARM设备更新的glibc。您可以 libc 从交叉编译器目录复制到ARM设备。在更新主库之前,我建议使用LD_LIBRARY_PATH进行测试。使用ls /var/lib/dpkg/info/*arm-linux*.list查看与ARM编译器相关的大多数软件包。您可以使用grep来确定库的位置(或apt-file等更高级的东西)。

Crosstool-ng有一个populate脚本,但我没有在Ubuntu包中看到它;它非常适合您的问题。如果它出现在您的Debian版本上,我会使用它。

glibc 2.15向后兼容当前在您系统上的 glibc 2.11。如果编译器配置了不同的选项(不同的ABI),则可能会出现问题;但是,如果是这种情况,除了库之外,您的构建 Qt 会遇到很多问题。在这种情况下,您需要找到一个更适合根文件系统的编译器。

所以要明确,在目标上

  mkdir /lib/staging
  cp libc.so-2.15 /lib/staging
  cd /lib/staging
  ln -s libc.so-2.15 libc.so
  LD_LIBRARY_PATH=/lib/staging ls  # test the library

您可能必须复制其他库,例如 pthread resolv rt crypt 等这些文件可能位于 sysroot / lib 之类的目录中。您可以将整个目录复制到 / lib / staging 进行测试。如果上述ls函数,那么编译器应该 ABI 兼容。如果您遇到崩溃或不是可执行文件,则编译器和rootfs可能不兼容。

  

是否有更好的方法来提供所需的库,或者复制它们是否正常?

如上所述,复制可能罚款。如果不好,则必须更新编译器或根文件系统。

  

我如何克服上述错误?

尝试以上方法。同样,您可以单独保留根文件系统。设置影子目录和use chroot以运行 Qt 应用程序,将复制的文件作为另一种解决方案。要对此进行测试,请创建一个非常简单的程序,并将其放在测试目录中的编译器库中,如上所述的 / lib / staging 。然后测试代码可以像

一样运行
 $ LD_LIBRARY_PATH=/lib/staging ./hello_world

如果这不起作用,则编译器和ARM文件系统/ OS不兼容。没有图书馆的魔法会有所帮助。

  

我已经阅读了一些关于静态构建它的内容,但我不确定如何以及它的缺点是什么。

Linux static linking is dead。我明白这似乎是一个解决方案。但是,如果编译器错误,这将无济于事。 OS,库以及OS保存的寄存器之间的调用约定将隐含在编译代码中。您可能需要rebuild Qt with -softfp, etc