有時(shí)候conda莫名奇妙就會(huì)丟失一些庫(kù),幾周前運(yùn)行得好好的環(huán)境,卻在前天import torch的時(shí)候突然提示:
ImportError: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found
看提示發(fā)現(xiàn),這是個(gè)conda環(huán)境,卻調(diào)用了系統(tǒng)庫(kù)。我確信我在當(dāng)前conda環(huán)境中已經(jīng)安裝了可用的gcc。網(wǎng)上的檢索出來(lái)的方法無(wú)非是在conda里重新安裝gcc或者glibc,或者把環(huán)境里的庫(kù)放到用戶(hù)的LIBRARY_PATH里。前者我嘗試過(guò)無(wú)效,并且需要重新下載安裝大量依賴(lài);后者我沒(méi)有嘗試,因?yàn)榭紤]到這樣做會(huì)破壞環(huán)境的獨(dú)立性。
解決方案是:
找到conda環(huán)境中的庫(kù)所在的目錄,看有沒(méi)有l(wèi)ibstdc++.so.6文件,一般在
~/miniconda3/envs/envname/lib/libstdc++.so.6
如果不存在這個(gè)文件,或者文件中沒(méi)有GLIBCXX_3.4.21,但是存在類(lèi)似的文件,如
$ 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
并且在某個(gè)文件(如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
只需要在此處建立一個(gè)叫l(wèi)ibstdc++.so.6軟鏈接指向libstdc++.so.6.0.22即可
$ ln -s libstdc++.so.6.0.22 libstdc++.so.6
問(wèn)題解決~
————————————
2020/01/06更正
在libstdc++.so.6.0.22中,庫(kù)依然不全,在導(dǎo)入import torch時(shí)會(huì)出現(xiàn)
libstdc++.so.6: version `CXXABI_1.3.11' not found
刪除libstdc++.so.6,然后建立軟鏈
$ ln -s libstdc++.so.6.0.28 libstdc++.so.6
問(wèn)題再次解決~