有时候conda莫名奇妙就会丢失一些库,几周前运行得好好的环境,却在前天import torch的时候突然提示:
ImportError: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found
看提示发现,这是个conda环境,却调用了系统库。我确信我在当前conda环境中已经安装了可用的gcc。网上的检索出来的方法无非是在conda里重新安装gcc或者glibc,或者把环境里的库放到用户的LIBRARY_PATH
里。前者我尝试过无效,并且需要重新下载安装大量依赖;后者我没有尝试,因为考虑到这样做会破坏环境的独立性。
解决方案是:
找到conda环境中的库所在的目录,看有没有libstdc++.so.6文件,一般在
~/miniconda3/envs/envname/lib/libstdc++.so.6
如果不存在这个文件,或者文件中没有GLIBCXX_3.4.21,但是存在类似的文件,如
$ cd ~/miniconda3/envs/envname/lib/
$ ll | grep libstdc++
-rw-r--r-- 2 xxx xxx 4669688 Aug 1 2016 libstdc++.a
-rw-r--r-- 2 xxx xxx 722358 Aug 1 2016 libstdc++fs.a
-rwxr-xr-x 1 xxx xxx 941 Sep 7 23:05 libstdc++fs.la
-rwxr-xr-x 1 xxx xxx 1001 Sep 7 23:05 libstdc++.la
lrwxrwxrwx 1 xxx xxx 19 May 16 2020 libstdc++.so.6.0.21 -> libstdc++.so.6.0.24
-rwxr-xr-x 2 xxx xxx 1561568 Aug 1 2016 libstdc++.so.6.0.22
-rw-r--r-- 1 xxx xxx 2487 Sep 7 23:05 libstdc++.so.6.0.22-gdb.py
-rwxrwxr-x 2 xxx xxx 13139544 Oct 3 08:49 libstdc++.so.6.0.28
并且在某个文件(如libstdc++.so.6.0.22)中有我想要的版本GLIBCXX_3.4.21
$ strings libstdc++.so.6.0.28 | grep GLIBCXX
...
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
...
GLIBCXX_DEBUG_MESSAGE_LENGTH
只需要在此处建立一个叫libstdc++.so.6软链接指向libstdc++.so.6.0.22即可
$ ln -s libstdc++.so.6.0.22 libstdc++.so.6
问题解决~
————————————
2020/01/06更正
在libstdc++.so.6.0.22
中,库依然不全,在导入import torch时会出现
libstdc++.so.6: version `CXXABI_1.3.11' not found
删除libstdc++.so.6
,然后建立软链
$ ln -s libstdc++.so.6.0.28 libstdc++.so.6
问题再次解决~