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

江木123 2024-08-10 15:07:02 阅读 60

问题描述:`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 GLIBCXXls -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.gzcd gcc-12.1.0./contrib/download_prerequisitesmkdir buildcd build…/configure --prefix=/home/dujiang/gcc --disable-multilibmake -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/libstrings libstdc++.so.6 | grep GLIBCXXls -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.29rm 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,代表我们的操作不会对系统造成改变,那么即使失败也不会影响系统环境,可以大胆尝试,同时建议不要选取对系统环境造成影响的解决方案。

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



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。