• gcc/c++ 版本不一致问题导致的


    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-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)

    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

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

  • 相关阅读:
    安装sourcetree并操作Git
    Aviation turbofan starting model
    Vue导航守卫beforeRouteEnter,beforeRouteUpdate,beforeRouteLeave
    NBlog Java定时任务-备份MySQL数据
    《机器学习实战:基于Scikit-Learn、Keras和TensorFlow(第2版)》学习笔记
    全国各区县日照时长数据,逐月数据均有!
    【Java 基础篇】深入了解Java的File类:文件和目录操作指南
    好用的vscode插件
    架构思考(四)
    建造者模式
  • 原文地址:https://blog.csdn.net/u011304078/article/details/132861429