zoukankan      html  css  js  c++  java
  • 【C++调试】"./xxx: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ./xxx)" 执行报错

    问题

    Linux 上运行可执行文件,报错:

     原因

    gcc 动态库版本太低

    解决方案

    1.方案一

    不需要 root 权限

     vi  ~/.bash_profile 

    在文件中添加如下代码:

    LD_LIBRARY_PATH=/home/feng/anaconda3/lib:$LD_LIBRARY_PATH     //(将anaconda3库文件路径添加到系统的库文件路径中)
    export LD_LIBRARY_PATH

    执行代码:

    $ source  ~/.bash_profile

    2.方案二

    需要 root 权限

    a. 查看动态库

    [root@model Test_Bench]# strings /usr/lib64/libstdc++.so.6 | grep CXXABI
    CXXABI_1.3
    CXXABI_1.3.1
    CXXABI_1.3.2
    CXXABI_1.3.3
    CXXABI_1.3.4
    CXXABI_1.3.5
    CXXABI_1.3.6
    CXXABI_1.3.7
    CXXABI_TM_1

    发现最高版本只有 1.3.7,没有 1.3.9,说明出现这些问题,是因为升级 gcc 时,生成的动态库没有替换老版本 gcc 的动态库。

    [root@model Test_Bench]# ls -l /usr/lib64/libstdc++.so.6
    lrwxrwxrwx. 1 root root 19 Jan 15 2021 /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.19

    我们发现 libstdc++.so.6 是个软连接,连接到 libstdc++.so.6.0.19 上的,而 libstdc++.so.6.0.19 是老版本的动态库。所以下面我们要做的就是将 libstdc++.so.6 连接到新版本的动态库上去

    b.  执行以下命令,查找编译 gcc 时生成的最新动态库:(有时找不到最新的动态库,可以参考方案三)

    [root@model Test_Bench]# find / -name "libstdc++.so.*"/usr/lib64/libstdc++.so.6
    /usr/lib64/libstdc++.so.6.0.19
    /usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.py
    /usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyc
    /usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyo
    /usr/gcc8.2.0/lib64/libstdc++.so.6.0.25
    /usr/gcc8.2.0/lib64/libstdc++.so.6
    /usr/gcc8.2.0/lib64/libstdc++.so.6.0.25-gdb.py
    /home/software/gcc-8.2.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.25
    /home/software/gcc-8.2.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
    /home/software/gcc-8.2.0/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.25
    /home/software/gcc-8.2.0/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
    /home/software/gcc-8.2.0/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.25
    /home/software/gcc-8.2.0/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6

    其中/home/software/gcc-8.2.0 是我们升级 gcc 时的输出目录,libstdc++.so.6.0.25 是我们的新版本的动态库。

    c. 将上面的最新目录复制到 /usr/lib64/ 目录下:

    [root@model Test_Bench]# cp /usr/gcc8.2.0/lib64/libstdc++.so.6.0.25 /usr/lib64/
    [root@model Test_Bench]# cd /usr/lib64/

    d. 将 libstdc++.so.6 连接到 libstdc++.so.6.0.25 上去:

    [root@model Test_Bench]# cd /usr/lib64/
    [root@model Test_Bench]# rm -rf libstdc++.so.6
    [root@model Test_Bench]# ln -s libstdc++.so.6.0.25 libstdc++.so.6

    e.  默认动态库升级完成。重新运行以下命令检查动态库:

    [root@model lib64]# strings /usr/lib64/libstdc++.so.6 | grep "CXXABI"
    CXXABI_1.3
    CXXABI_1.3.1
    CXXABI_1.3.2
    CXXABI_1.3.3
    CXXABI_1.3.4
    CXXABI_1.3.5
    CXXABI_1.3.6
    CXXABI_1.3.7
    CXXABI_1.3.8
    CXXABI_1.3.9
    CXXABI_1.3.10
    CXXABI_1.3.11
    CXXABI_TM_1
    CXXABI_FLOAT128

    可见确实连接到新的动态库上去了。完成!

    3. 方案三

    进行到方案二步骤 b 时,如果找不到 gcc 中的最新的动态库,可以将 anaconda3/lib 中的 最新的动态库 libstdc++.so.6.0.25 (可能有的版本不一样,只要是版本最新的即可),拷贝到 "/usr/lib64" 目录下。

    可以通过下面的命令,查看 anaconda3/lib/libstdc++.so.6 中是否有 CXXABI_1.3.9

    [root@model Test_Bench]# strings /anaconda3/lib/libstdc++.so.6 | grep 'CXXABI'

    再将 libstdc++.so.6 连接到 libstdc++.so.6.0.25上去。

  • 相关阅读:
    Linux 进程间通信(包含一个经典的生产者消费者实例代码)
    Linux多进程编程实例
    web开发中的mysql使用
    Linux 网络编程中的read和write函数正确的使用方式
    Linux 使用tcpdump观察arp通信过程
    Linux 开启echo等服务
    Linux send和recv
    自己动手写http服务器——主程序(三)
    自己动手写http服务器——线程池(一)
    http请求报文格式和响应报文格式
  • 原文地址:https://www.cnblogs.com/SchrodingerDoggy/p/15680458.html
Copyright © 2011-2022 走看看