在RStudio Server上 library(magick)显示/lib64/libstdc++.so.6: version `GLIBCXX_3.4.31' not found
省流:conda下载GLIBCXX_3.4.31,然后cp到/lib64/下
报错信息:
library(magick)
Error: package or namespace load failed for ‘magick’ in dyn.load(file, DLLpath = DLLpath, ...):
unable to load shared object '/share/apps/repos/R/20240315/lib/R/library/magick/libs/magick.so':
/lib64/libstdc++.so.6: version `GLIBCXX_3.4.31' not found (required by /share/apps/repos/R/20240315/lib/R/library/magick/libs/../../../.././libheif.so.1)
但是我明明记得我conda装过这玩意,于是我不用RStudio Server,直接在终端的conda环境下输入:R,进入R,library(magick)竟能成功。
分析
RStudio Server的R说/lib64/libstdc++.so.6: version `GLIBCXX_3.4.31' not found
终端conda base 环境下的R没报错,说明conda路径下有`GLIBCXX_3.4.31',而/lib64/没有
检查一下:
#看/lib64/有无GLIBCXX_3.4.31(此处/usr/lib64/几乎通用,无需改路径)
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX_3.4.31
#看conda路径有无GLIBCXX_3.4.31(此处/share/apps/repos/R/20240315/lib/ 不通用,换成你的conda路径)
strings /share/apps/repos/R/20240315/lib/libstdc++.so.6 | grep GLIBCXX_3.4.31
结果:conda下有。/lib64/下没有,而RStudio Server的R连的是/lib64/,所以它find不到`GLIBCXX_3.4.31'
解决方案:
用万能的root账户把conda的 GLIBCXX_3.4.31'复制到/usr/lib64/下就行了。
1、如果你的conda也没有GLIBCXX_3.4.31',那你就用conda装一个
conda install -c conda-forge libstdcxx-ng
2、登录root。在root中操作,确认 conda 的文件存在且有 3.4.31 符号:
ls -l /share/apps/repos/R/20240315/lib/libstdc++.so.6.0.34
strings /share/apps/repos/R/20240315/lib/libstdc++.so.6.0.34 | grep GLIBCXX_3.4.31
应该看到文件存在,且有 GLIBCXX_3.4.31 输出。
3、复制新版到系统路径(覆盖旧的):
cp /share/apps/repos/R/20240315/lib/libstdc++.so.6.0.34 /usr/lib64/
4、更新符号链接(让 /usr/lib64/libstdc++.so.6 指向新版):
ln -sf /usr/lib64/libstdc++.so.6.0.34 /usr/lib64/libstdc++.so.6
5、验证系统库现在有 3.4.31:
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX_3.4.31
应该输出 GLIBCXX_3.4.31。
6、关闭浏览器所有 RStudio 标签(一定要彻底关闭!)。
重新登录 RStudio Server。然后就能正常library了
感悟
此环节没有意义,只是debug几个小时后没忍住的bb,我试了改RStudio Server的lib,重装旧版magick....全都不中,没想到cp一下就解决了。🤡