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.分析思路
查看了很多网络信息,发现这个主要有两种方式解决,一种是升级GLIBC, 另一种升级gcc 和g++;
下面是设备端的查看的GLIBC的信息的指令,发现最高仅到2.30,没有GLIBC_2.34的版本, 考虑这种思路,参考/lib/aarch64-linux-gnu/libm.so.6: version `GLIBC_2.29‘ not found_version `glibc_2.29' not found_诺水城子的博客-CSDN博客
我决定用另外的方法。
在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
有博主认为这是因为编译环境下的gcc及g++版本和目标板的版本不同造成的,(参考:) 因为pc端的gcc及g++都是11.4.0版本的,但是设备端的gcc和g++是9.4.0版本的。
因此我打算在目标板按照高版本的gcc及g++,并于编译环境下的gcc和g++保持一致。
我发现g++可以通过 sudo apt-get install g++-11来安装完成,但是用这种方法安装gcc却找不到源。
3.解决方式
于是我参考这篇文章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-9 80
通过升级设备端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)