1.问题
rk3566板子的系统是ubuntu20.04 focal, /etc/apt/source.list更换为阿里源
x86-67的pc主机系统的是ubuntu20.04 jammy/etc/apt/source.list 更换为清华源
按照rknpu2的开发教程Rockchip_Quick_Start_RKNN_SDK_V1.5.2_CN.pdf:
交叉编译通过后(交叉编译的问题在这个文档中有记录:CSDN),把相关产生的文件通过adb push到远处的设备端,
执行命令:
./rknn_yolov5_demo ./model/RK3566_RK3568/yolov5s-640-640.rknn ./model/bus.jpg
出现错误:
./rknn_yolov5_demo: /lib/aarch64-linux-gnu/libc.so.6: version `GLIBC_2.34′ not found (required by ./rknn_yolov5_demo)
./rknn_yolov5_demo: /lib/aarch64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29′ not found (required by ./rknn_yolov5_demo)
2.分析思路
查看了很多网络资料,终于解决了问题,我下面梳理一下解决思路,主要我是通过两个步骤完成的,第一是升级rk设备端的gcc和g++版本,第二是安装GBLC_3.24
(1)
有博主认为这是因为编译环境下的gcc及g++版本和目标板的版本不同造成的,(参考:) 因为pc端的gcc及g++都是11.4.0版本的,但是设备端的gcc和g++是9.4.0版本的。
因此我打算在目标板按照高版本的gcc及g++,并于编译环境下的gcc和g++保持一致。
(2)
下面是设备端的查看的GLIBC的信息的指令,发现最高仅到2.30,没有GLIBC_2.34的版本, 考虑这种思路,参考
version `GLIBC_2.34‘ not found简单有效解决方法_huazhang_001的博客-CSDN博客
Ubuntu – Package Download Selection — libc6_2.35-0ubuntu3_amd64.deb
我决定用另外的方法。
在rk3566设备端(ubuntu20.04 focal)输入:strings /lib/aarch64-linux-gnu/libc.so.6 | grep GLIBC_
在x86-64的pc端(ubuntu20.04 jammy)输入: strings /lib/x86_64-linux-gnu/libc.so.6 |grep GLIBC_
分别显示如下,可看出rk3566端的GLIBC_版本最高到2.30
3.解决方式
3.1 升级gcc/g++
升级g++:
sudo apt-get install g++-11
上述指令无法安装gcc-11
于是我参考这篇文章Ubuntu升级GCC版本_quxuexi的博客-CSDN博客,来安装gcc-11.4.0
1.添加相应的源
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
2.更新软件源
sudo apt-get update
3.安装最新版gcc
sudo apt-get install gcc-11.4.0
4. 配置不同版本的g++,gcc
现在设备端有两个版本的gcc及g++,所以现在开始配置gcc及g++的版本选项,参考https://www.cnblogs.com/livelab/p/13049117.html
以下命令为每个版本配置替代版本,并将优先级与之关联。默认版本是优先级最高的版本,在本例中为gcc-11
分别配置gcc-11/g++-11 及gcc-9/g++-9(这种联合配置gcc和g++的方法会出错,请使用后面分开配置的方式)
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 100
--slave /usr/bin/g++ g++ /usr/bin/g++-11
--slave /usr/bin/gcov gcov /usr/bin/gcov-11
sudo update-alternatives –install /usr/bin/gcc gcc /usr/bin/gcc-9 80
–slave /usr/bin/g++ g++ /usr/bin/g++-9
–slave /usr/bin/gcov gcov /usr/bin/gcov-9
以后,如果要更改默认版本,请使用以下update-alternatives
命令:
sudo update-alternatives –config gcc
因为不小心多设置的了一次,所以gcc11有两个,这里我选择gcc-11作为我的默认版本,然后输入gcc–version命令,发现也已经是配置选项的gcc了。
如果想删除配置的gcc,可以用该命令(参考ubuntu中的update-alternatives命令_Lamar Davis的博客-CSDN博客):
sudo update-alternatives –remove gcc /usr/bin/gcc-11
我发现用上述统一配置gcc和g++的方式出错,就是master的gcc配置成功,但是g++配置无效,所以我尝试打算分开配置的方式(参考:update-alternatives: error: alternative g++ can’t be slave of gcc: it is a master alternative_Longlongaaago的博客-CSDN博客),先把之前配置成功的gcc用上述方法删除。
sudo update-alternatives –install /usr/bin/g++ g++ /usr/bin/g++-11 100
sudo update-alternatives –install /usr/bin/g++ g++ /usr/bin/g++-9 80
sudo update-alternatives –install /usr/bin/gcc gcc /usr/bin/gcc-11 100
sudo update-alternatives –install /usr/bin/gcc gcc /usr/bin/gcc-980
通过升级设备端gcc和g++的版本至11.4.0后,再次执行模型的推理程序发现错误提示减少了一个…..version `GLIBCXX_3.4.29’……,另一个提示如下已经存在。好像也解决了一些问题,但不知是否多余,因为后面还有关键一步。
./rknn_yolov5_demo: /lib/aarch64-linux-gnu/libc.so.6: version `GLIBC_2.34′ not found (required by ./rknn_yolov5_demo)
3.1 升级GBLC_
参考:version `GLIBC_2.34‘ not found简单有效解决方法_huazhang_001的博客-CSDN博客
(1)编辑源: sudo vi /etc/apt/sources.list
(2)添加高版本源:deb http://th.archive.ubuntu.com/ubuntu/jammy main #添加该行
(2)添加高版本源:deb http://th.archive.ubuntu.com/ubuntu-port/ jammy main #添加该行
(3)更新源:sudo apt update
E: Failed to fetch https://mirrors.tuna.tsinghua.edu.cn/ubuntu/dists/jammy/main/binary-arm64/Packages 404 Not Found [IP: 101.6.15.130 443]
E: Some index files failed to download. They have been ignored, or old ones used instead.
出现这个问题是因为第二步添加源的时候使用路径中 /ubuntu ,而arm架构的平台应该用/ubuntu-ports
参考:RK3399开发板ubuntu20.04报错 binary-arm64/Packages 404 – 知乎
(4)安装: sudo apt install libc6
然后再次查看GLIBC_的版本strings /lib/aarch64-linux-gnu/libc.so.6 | grep GLIBC_ , 可以看到已经最高到2.35版本了,
再次执行RK的demo
./rknn_yolov5_demo ./model/RK3566_RK3568/yolov5s-640-640.rknn ./model/bus.jpg
程序正常运行,问题解决。