问题描述:`GLIBCXX_3.4.x’ not found
这里说下网上有的部分解决方法,一个是搜索本地中有缺失的GLIBCXX_3.4.x的libstdc++.so.6.0.xx文件,一个是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/pypocketfft.cpython-38-x86_64-linux-gnu.so)
- 解决方法 - 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.4.x,并且可以看到libstdc++.so.6链接的具体文件,以上都是确定我们确实没有GLIBCXX_3.4.x- 下载gcc12.1.0(里面包含GLIBCXX_3.4.30)- 下载方法wget https://ftp.gnu.org/gnu/gcc/gcc-12.1.0/gcc-12.1.0.tar.gz(11.2.0有3.4.29无30)- tar -xvf gcc-12.1.0.tar.gz- 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
- 由于系统中/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/c-lang.o] 错误 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/…/…/…/./libgeos.so.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++)
方法优势:整个过程不需要sudo,代表我们的操作不会对系统造成改变,那么即使失败也不会影响系统环境,可以大胆尝试,同时建议不要选取对系统环境造成影响的解决方案。
如果解决了你的问题,希望可以三连,后续会不断更新
版权归原作者 江木123 所有, 如有侵权,请联系我们删除。