x210开发板升级glibc-2.10到glibc-2.18版本的解决方案

一、问题的出现

最近用QT5.12.04的版本开发了一个qmqtt客户端,移值到开发板上运行时出现如下报错:

./mqttsubscriptions: /lib/libc.so.6: version `GLIBC_2.16’ not found (required by /QT5.12.4_ARM/lib/libQt5Core.so.5)
./mqttsubscriptions: /lib/libc.so.6: version `GLIBC_2.17’ not found (required by /QT5.12.4_ARM/lib/libQt5Core.so.5)

为什么会报错:因为这是我现在要运行的可执行文件使用到的库(libQt5Core.so.5),要求glibc的版本在2.17版本以上,而我现在的x210开发板中glibc版本是低于2.17的,所以报错了。好的,使用strings命令查看一下现在glibc的版本到底是多少?

使用命令: strings /lib/libc.so.6 | grep GLIBC_

[root@CRG-X210 ]# strings /lib/libc.so.6 | grep GLIBC_
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_PRIVATE
[root@CRG-X210 ]# 

以上显示得知最高支2.10版本

二、问题的解决

解决思路1:使用低版本的QT重新编译可执行文件 (在编译过程中可能又会遇到不同的问题,放弃!)

解决思路2:下载glibc2.17版本以上的源码,交叉编译后移植到x210中使用(过程太复杂,可能又会踩到坑,放弃)

解决思路3:使用现成的,现成的?哪里有?莫急,下面慢慢道来!

1、找到现成的glibc2.17以上的版本

其实这个glibc2.17以上的版本就在交叉编译可执行文件的工具链里面,那么问题来了,我的Ubuntu中装了N多个版本的交叉编译工具链,我怎么知道在哪个叉编译工具链去找呢?简单,还是使用strings命令查看报错的库文件(libQt5Core.so.5)是用哪个交叉编译工具链编译出来的。

使用命令:strings /QT5.12.4_ARM/lib/libQt5Core.so.5 | grep GCC

[root@CRG-X210 ]# strings /QT5.12.4_ARM/lib/libQt5Core.so.5 | grep GCC
GCC_3.0
GCC_3.4
GCC_3.5
Qt 5.12.4 (arm-little_endian-ilp32-eabi shared (dynamic) release build; by GCC 4.8.3 20140320 (prerelease))
GCC: (Sourcery CodeBench Lite 2014.05-29) 4.8.3 20140320 (prerelease)
[root@CRG-X210 ]# 

以上显示这个库文件(libQt5Core.so.5)是用名为"2014.05-29",版本为"4.8.3"的交叉编译工具链编译出来的。

2、 使用现成的glibc2.17以上的版本移值到x210开发板上

经过上一步已找到相对应的交叉工具链,现在进入这个交叉工具链libc.so.6文件所在的目录,我的目录路是:/usr/local/arm/arm-2014.05/arm-none-linux-gnueabi/libc/lib,当然,你的目录路径可能和我的是不一样的哦。ls 查看下。

使用命令:ls

root@chenrg-virtual-machine:/usr/local/arm/arm-2014.05/arm-none-linux-gnueabi/libc/lib# ls
ld-2.18.so               libc-2.18.so      libdl-2.18.so   libm.so.6              libnss_db.so.2         libnss_hesiod.so.2      libpthread-2.18.so  libSegFault.so
ld-linux.so.3            libcidn-2.18.so   libdl.so.2      libnsl-2.18.so         libnss_dns-2.18.so     libnss_nis-2.18.so      libpthread.so.0     libthread_db-1.0.so
libanl-2.18.so           libcidn.so.1      libgcc_s.so     libnsl.so.1            libnss_dns.so.2        libnss_nisplus-2.18.so  libresolv-2.18.so   libthread_db.so.1
libanl.so.1              libcrypt-2.18.so  libgcc_s.so.1   libnss_compat-2.18.so  libnss_files-2.18.so   libnss_nisplus.so.2     libresolv.so.2      libutil-2.18.so
libBrokenLocale-2.18.so  libcrypt.so.1     libm-2.18.so    libnss_compat.so.2     libnss_files.so.2      libnss_nis.so.2         librt-2.18.so       libutil.so.1
libBrokenLocale.so.1     libc.so.6         libmemusage.so  libnss_db-2.18.so      libnss_hesiod-2.18.so  libpcprofile.so         librt.so.1

以上显示的库文件中,其中有一个文件是libc.so.6,使用strings命令查看一下libc.so.6这个文件最高支持glibc版本是多少?

使用命令:strings libc.so.6 | grep GLIBC_

root@chenrg-virtual-machine:/usr/local/arm/arm-2014.05/arm-none-linux-gnueabi/libc/lib# strings libc.so.6 | grep GLIBC_
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_2.13
GLIBC_2.14
GLIBC_2.15
GLIBC_2.16
GLIBC_2.17
GLIBC_2.18
GLIBC_PRIVATE

以上显示这个libc.so.6最高支持2.18版本。好了,就是它。将这个文件夹中的所有文件强行复制到开发板lib目录下。注意:先备份lib文件夹再进复制,预防出错!

使用命令:cp * /home/chenrg/windows-share/SI_source/rootfs/rootfs/lib -rf

重新执行可执文件…

OK,不再报错了,可执行文件完美的运行了!!!

因我使用的是nfs文件系统,所以可以直接复制到开发板上。如果你没有使用nfs文件系统,用别的方式也可以的。另外复制之前要先备份原有lib文件夹,一定要先备份、备份、备份。

猜你喜欢

转载自blog.csdn.net/qq_16126823/article/details/121438953