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

程序正常运行,问题解决。