已解决 | 在conda环境中无法找到GLIBCXX_3.4.21

有时候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

问题再次解决~

推荐阅读更多精彩内容