c++ - 如何在 tiny210 设备上使用 Qt 应用程序?

标签 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: 由于 artless noise 的回答,我设法克服了上述错误,但现在我得到:加载共享库时出错:libQtGui。 so.4: 无法打开共享对象文件:没有那个文件或目录

最佳答案

问题是交叉编译器 (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

您可能需要复制额外的库,例如 pthreadresolvrtcrypt 等. 这些文件可能位于 sysroot/lib 之类的目录中。您可以将整个目录复制到 /lib/staging 进行测试。如果上面的 ls 起作用,那么编译器应该是 ABI 兼容的。如果您遇到崩溃或不是可执行文件,则编译器和 rootfs 可能不兼容。

Would there have been a better way to provide the needed libraries, or copying them is fine?

按照上述方法复制可能没问题。如果不正常,则必须更新编译器或根文件系统。

How can I get over the errors mentioned above?

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

 $ LD_LIBRARY_PATH=/lib/staging ./hello_world

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

I've read something about building it static, but I am not sure how, and what are the downsides of this.

参见 Linux static linking is dead .我知道这似乎是一个解决方案。但是,如果编译器错误,这将无济于事。操作系统、库和操作系统保存哪些寄存器之间的调用约定将隐含在编译代码中。您可能需要 rebuild Qt with -softfp, etc .

关于c++ - 如何在 tiny210 设备上使用 Qt 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20994867/

相关文章:

C++ Auto 关键字 - Float 与 Int 问题

c++ - 在 C++ 中将十六进制转换为字节

c++ - 将基于像素的图形绘制到 QWidget

c++ - 用 CGAL 编译一个简单的测试

c++ - 为什么 Herb Sutter 的监视器示例采用 'T' 而不是 'T&' 或 'T&&' ?

qt - QtWebEngine 依赖应用程序的静态构建

c++如何从图像中获取像素坐标?

c++ - QT关闭子窗口后如何执行函数

c++ - Qt 智能指针相当于 Boost::shared_ptr ?

qt - 如何使用 QListWidget 响应内部拖放操作?