一、问题的出现
最近用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 ]
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 ]
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
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
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文件夹,一定要先备份、备份、备份。