平台ubuntu matlab2016b
现象
ImportError: /usr/local/XXXXXXX/R2016b/glnxa64/libstdc++.so.6: version `GLIBCXX_3.4.21’ not found
源码编译升级安装了gcc后,编译程序或运行其它程序时,有时会出现类似/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21’ not found的问题。这是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库导致的,将gcc最新版本的动态库替换系统中老版本的动态库即可解决。
为了安装最新版本的Node.js(最新版本的Node.js使用了C++ 11中,而C++ 11需要code>gcc 4.8+才能支持),将gcc升级到了当前最新版本v 5.2.0。升级后,成功编译安装了新版本的Node.js(v 4.2.1),但运行时程序时出现了以下错误:
- node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21’ not found (required by node)
- node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15’ not found (required by node)
- node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20’ not found (required by node)
查找问题
进入报错的了路径,再输入strings ./libstdc++.so.6 | grep GLIBC
cd /usr/local/MATLAB/R2016b/sys/os/glnxa64
strings ./libstdc++.so.6 | grep GLIBC
查看当前的gcc版本
可以看到最新的版本是GLIBCXX_3.4.20,但是报错是“ImportError: /usr/local/XXXXXXX/R2016b/glnxa64/libstdc++.so.6: version `GLIBCXX_3.4.21’ not found”,试图载入3.4.21,肯定会报错。
根据报错的提示,在终端输入
find / -name "libstdc++.so*"
用来查找编译gcc时生成的最新动态库:
这里面会有多个libstdc++.so.6.0.26 说明这个就是最新的动态库,下面把这个动态库拷贝到报错说找不到文件的地方去。
cp /home/chaoren/anaconda3/lib/libstdc++.so.6.0.26 /usr/local/MATLAB/R2016b/sys/os/glnxa64
会有权限报错
cp: cannot create regular file '/usr/local/MATLAB/R2016b/sys/os/glnxa64/libstdc++.so.6.0.26': Permission denied
所以需要开始root权限
sudo su -
cp /home/chaoren/anaconda3/lib/libstdc++.so.6.0.26 /usr/local/MATLAB/R2016b/sys/os/glnxa64
复制完成后用下面命令测试发现还是没有更新
cd /usr/local/MATLAB/R2016b/sys/os/glnxa64
strings ./libstdc++.so.6 | grep GLIBC
确实不会更新,因为我们的操作还没有完成,刚才仅仅是复制了文件,还需要修改系统默认动态库的指向,即:重建默认库的软连接。
切换目录并进行软连接:
cd /usr/local/MATLAB/R2016b/sys/os/glnxa64
rm -rf libstdc++.so.6
ln -s libstdc++.so.6.0.26 libstdc++.so.6
至此,操作完成,使用下列代码查验:
cd /usr/local/MATLAB/R2016b/sys/os/glnxa64
strings ./libstdc++.so.6 | grep GLIBC
结果显示:
更新成功,不报错了。
参考链接
https://www.linuxidc.com/Linux/2017-10/147621.htm
https://www.gitmemory.com/issue/tensorflow/tensorflow/32111/526751353