我想在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.4
,libQtNetwork.so.4
和libQtGui.so.4
,我也遇到了错误。我只是通过将已编译的库从我的主机PC复制到设备来修复这些错误。
第一个问题是:是否有更好的方法来提供所需的库,或者复制它们是否合适?
第二个问题是:如何克服上述错误?
编辑:我已经阅读了有关将其构建为静态的内容,但我不确定如何以及这有什么缺点。
EDIT2:由于无艺术噪音的答案,我设法克服了上述错误,但现在我得到了:error loading shared libraries: libQtGui.so.4: cannot open shared object file: No such file or directory
。
答案 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。