最近在Centos7 64位服务器上搭建环境,遇到了两个问题:其一:/lib/libstdc++.so.6 : version 'GLIBCXX3.4.20' not found,其二:ImportError:/lib64/libc.so.6 : version' GLIBC_2.18' not found。花了一个下午才搞定,其中好几次都失败了,在这里记录一下。
由于我的环境已经配置好,所以我的截图会和之前不同,这里会对图进行特别说明,请注意。要注意每个命令,切忌不要拼写输入错误~~
[问题一]上述错误时由于libstdc++.so.6没有对应的GLIBCXX造成的,可通过如下命令查看:
# strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
图1说明:没有配置好的话红色框中的内容是没有的,我是下载了libstdc++.so.6.0.24。
![60a21d1d948b793ae6c13df2f9a4e51f.png](https://img-blog.csdnimg.cn/img_convert/60a21d1d948b793ae6c13df2f9a4e51f.png)
你会发现你自己的少了GLIBCXX_3.4.20,解决办法是升级libstdc++。
# yum provides libstdc++.so.6
图2说明:这里显示的是32位的libstdc++.so.6,从后缀名.i686可以看出,实际进行升级的时候根据你的centos系统来,我的是64位,所以执行命令的时候后缀需要进行修改(.x86_64),【这是第一个坑,一开始没注意总是升级失败或者后面更新GLIBC会出现64位和32位版本不匹配的问题】。
![e9578ecb6706431971c06bf22c5cafb1.png](https://img-blog.csdnimg.cn/img_convert/e9578ecb6706431971c06bf22c5cafb1.png)
# yum install libstdc++-4.8.5-36.el7.x86_64 --setopt=protected_multilib=false
- 从路径/usr/local/lib64/拷贝文件libstdc++.so.6.0.20(或者更高版本,例如libstdc++.so.6.0.24)到路径/usr/lib64。
# cp /usr/local/lib64/libstdc++.so.6.0.24 /usr/lib64
2. 删除/usr/lib64原来的软连接libstdc++.so.6
# cp /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6.back #建议先备份
# rm /usr/lib64/libstdc++.so.6
3. 在路径/usr/lib64,打开ternimal,输入软连接命令,重新建立软连接:
# ln libstdc++.so.6.0.24 libstdc++.so.6
4. 重新执行命令:
# strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
正常操作的话若会新出现图1中红色框内的内容,表示已经OK了。
但是,在我的centos服务器中在/usr/local/lib64/下根本就没有libstdc++.so.6.24,这个直接在CSDN上搜进行下载,放到/usr/local/lib64/目录下,就是假装它有,然后执行上述步骤1,2,3,4即可。
这里我把libstdc++.so.6.20(4)上传到网盘:链接:https://pan.baidu.com/s/1xpTVR5e_XeUS2xoCoKmgfQ
提取码:e79u 如果链接失效可联系我。
[问题二]这时运行Tensorflow的程序,又提示另外一个错误:ImportError:/lib64/libc.so.6 : version 'GLIBC_2.18' not found。
查看glibc详情,执行命令:
# strings /lib64/libc.so.6 | grep GLIBC_
说明:我的环境中已经安装好了glibc_2.18,所以显示会有,如红色框所示。
![cfcd42a460cd30cadeca399c55dc23ad.png](https://img-blog.csdnimg.cn/img_convert/cfcd42a460cd30cadeca399c55dc23ad.png)
解决办法:
- 下载并解压对应的glibc版本,在https://ftp.gnu.org/gnu/glibc/里下载对应版本,如:glibc-2.18.tar.gz,也可以直接在ternimal下执行:(这里建议最好把这个包下载在/opt/路径下)
# wget https://ftp.gnu.org/gnu/glibc/glibc-2.18.tar.gz
# tar -zxvf glibc-2.18.tar.gz
2. 进行编译安装
a.进入安装目录:
# cd glibc-2.18
b.创建编译安装目录:
# mkdir build
c.配置:
# ../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
(其实上一步仅执行:# ../configure --prefix=/usr)也行。
d.编译安装
# make -j20 (-j20的数字根据自己系统)
# make install
3. 编译成功后应该就OK啦,可以执行Tensorflow程序。
注意在第2步中make -j20的时候可能会遇到问题:LD_LIBRARY_PATH shouldn't contain the current directory。
解决办法是删除LD_LIBRARY_PATH变量的内容:
a. 显示原来的路径
# echo $LD_LIBRARY_PATH
// :/opt/glibc-2.18/lib
b. 设置其路径为空
# LD_LIBRARY_PATH=
等上述编译安装make -j20和make install安装成功之后再重新添加LD_LIBRARY_PATH。
# vim /etc/profile
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/glibc-2.18/lib
//wq后保存退出
# source /etc/profile
这里另外补充一句,在pip安装其他包的时候可以加上国内镜像源(豆瓣),速度会更快,命令为:
# pip install matplotlib -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
以上。