(含linux gcc编译过程)分析和解决`GLIBCXX_3.‘ not found问题及其他问题汇总,亲测有效

时间:2025-03-03 12:36:23

问题描述:`GLIBCXX_3.’ not found

这里说下网上有的部分解决方法,一个是搜索本地中有缺失的GLIBCXX_3.的libstdc++.so.6.文件,一个是conda install -c conda-forge gcc=12.1.0首先第二种方法本人使用并没有解决,第一种肯定可以解决,但是会破坏系统环境建议不使用,本文提供的方法都在确保不破坏系统环境的前提下解决该问题

  • 本文提供的更像是解决这个问题的思路,如果遇到疑惑可以留言看到会进行回复
  • 如果方法二无效在往下看,通常方法二可以解决大部分问题

具体问题描述1

ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.30’ not found (required by /home/xx/miniconda3/envs/xx/lib/python3.8/site-packages/scipy/fft/_pocketfft/-38-x86_64)

  1. 解决方法
    • strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX
    • ls -l /usr/lib/x86_64-linux-gnu/libstdc++.so.6 查看软连接情况
    • 上面可以发现我们打印的里面一定没有我们需要的GLIBCXX_3.,并且可以看到libstdc++.so.6链接的具体文件,以上都是确定我们确实没有GLIBCXX_3.
    • 下载gcc12.1.0(里面包含GLIBCXX_3.4.30)
    • 下载方法wget /gnu/gcc/gcc-12.1.0/gcc-12.1.(11.2.0有3.4.29无30)
    • tar -xvf gcc-12.1.
    • cd gcc-12.1.0
    • ./contrib/download_prerequisites
    • mkdir build
    • cd build
    • …/configure --prefix=/home/dujiang/gcc --disable-multilib
    • make -j$(nproc) (–prefix写自己的路径必须写不可省略,这样下面的install就可以不使用sudo权限
    • sudo make install
  2. 由于系统中/usr/lib/x86_64-linux-gnu/libstdc++.so.6已经链接到了其他版本,为了不影响系统环境采用如下方法让系统找到:
    • vim ~/.bashrc(下面的语句放在尽量前的位置,让系统先找这个路径)
      export PATH=/usr/local/gcc-4.9.4/bin/:$PATH export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib64/:$LD_LIBRARY_PATH export C_INCLUDE_PATH=/usr/local/include/:$C_INCLUDE_PATH export CPLUS_INCLUDE_PATH=/usr/local/include/:$CPLUS_INCLUDE_PATH
      source ~/.bashrc(容易出现问题的点:有可能需要退出整个界面在从新进入echo $LD_LIBRARY_PATH也可查看结果)

下载过程如果不指定–prefix就会下载到全局(系统),后续make install 就需要 sudo,所以这里一定要指定路径。
删除系统软链接是非常危险的,这里通过这种方法可以让系统找到路径并且不会影响系统环境。

2020.7.19更新

在make阶段一定会有人报错,我遇到过的大概报错如下:

make[3]: *** [c/] 错误 1 make[3]: 离开目录“/home/dujiang/gcc-8.3.0/build/gcc” 
make[2]: *** [all-stage1-gcc] 错误 2 
make[2]: 离开目录“/home/dujiang/gcc-8.3.0/build” 
make[1]: *** [stage1-bubble] 错误 2 
make[1]: 离开目录“/home/dujiang/gcc-8.3.0/build” make: *** [all] 错误 2

解决方法:安装zlib:yum install zlib-devel.x86_64 完成后从新连接服务器编译
编译错误从新编译时将build文件删除从新编译rm -rf build

具体问题描述2

ImportError: /home/dujiang/miniconda3/envs/Dlv3/bin/…/lib/libstdc++.so.6: version `GLIBCXX_3.4.29’ not found (required by /home/dujiang/miniconda3/envs/Dlv3/lib/python3.8/site-packages/shapely/…/…/…/./.3.12.1)

  • 问题2相对简单,因为他本身就没有去系统找东西而是在我们的虚拟环境中,那么解决方法就很简单
  • cd miniconda3/envs/Dlv3/lib
  • strings libstdc++.so.6 | grep GLIBCXX
  • ls -l libstdc++.so.6 发现连接的是系统的x86_64-linux-gnu/libstdc++.so.6,系统中不存在29版本是上面查到过的,所以要更换掉
  • ls -l libstdc++.so.6*(发现在当前文件夹自带了6.0.33)那么接下来替换掉就好,因为通过strings libstdc++.so.6.0.33 | grep GLIBCXX可以发现里面有我们需要的GLIBCXX_3.4.29
  • rm libstdc++.so.6 (先删除之前错误的)
  • ln -s libstdc++.so.6.0.33 libstdc++.so.6 (连接到有需要版本的即可,可以是上面下载的gcc中的,此时就可以让系统找到文件)

思考

通过这个角度看问题的话,我们第一种方法是下载gcc解决,但是第二种发现我们的conda环境中就自带了libstdc++,不确定是不是每个人的conda环境都有libstdc++(如果你们查看发现没有可能是之前执行过conda install -c conda-forge gcc=12.1.0等疑似解决方案导致环境有libstdc++)

20250210更新
  • 上面不确定是不是conda install -c conda-forge gcc=12.1.0生成了libstdc++.so的问题经过验证确实是他生成的
  • 并且方法二更优,因为不用编译gcc,gcc编译在非root用户编译时经常出问题
    方法优势:整个过程不需要sudo,代表我们的操作不会对系统造成改变,那么即使失败也不会影响系统环境,可以大胆尝试,同时建议不要选取对系统环境造成影响的解决方案。

如果解决了你的问题,希望可以三连,后续会不断更新