问题出现:

  在做一个项目的时候,我用到了我的虚拟机去跑一个程序,这时候出现/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found的错误,这时候我去百度了一下,找了一些解决办法,我试着操作了一下,自己差点没有升天。(由于本人linux经验的问题,所以没有意识到问题的严重性,所以在此也提醒下同样的小伙伴)

解决办法1:(注:千万不要使用!)

我最开始找到的办法,这个办法解决了问题,差点连我本人也一起解决掉了。你如果被这种办法迫害过的话,我下面附加了解决这种问题的办法。

这里把一些重要的话说在前面,要是你要做一些修改系统文件的复杂操作的时候,在这之前记得给自己的虚拟机留下一份快照,以防万一,说不准你的虚拟机就坏掉了,说在前面也是怕一些人不看提示就操作,到时弄坏了自己的虚拟机。

具体解决过程:

  1. 这里出现的问题是因为我们的libstdc++.so.6.0.n(<21)的库版本太旧了,我们要更换上版本高一点的库,版本不低于6.0.21就可以了。(/lib64下面使用find命令查看是否有这样的库:find ./ -name “libstdc++.so.6*”)

然后我们可以看见有如下两个文件:

libstdc++.so.6
libstdc++.so.6.0.xxx (<21)
  1. 所以我们下载libstdc++.so.6.0.21(≧ 21都行)的动态库,将其放入到我们的lib64文件夹中。
rm -rf libstdc++.so.6
  1. 这时候我们删除掉原来的libstdc++.so.6(只是删除软链接),然后重新创建一个软连接到我们新下载的动态库(不要操作!不要操作!不要操作!)
ln -s ./libstdc++.so.6.0.21 ./libstdc++.so.6
  1. 这时候我们重新打开之前的程序,这下运行成功了!

这时候你可能觉得没有什么问题,当你关掉虚拟机,重新开机的时候,这时候你会发现你的虚拟机突然之间就进入不了登录界面了,就是一直黑屏。我当时一脸懵逼,我以为是我虚拟机只是突然抽风卡了,于是我又重启了几遍,还是老样子,到登录界面前就一直黑屏了。我想重装系统的话,我之前的文件啥的都丢失了,项目还得重新去编译,还有其他的东西也要编译,一套流程下来可不是说重装就重装的。而且我也没有保存当时的快照,真是惨痛的教训。

下面是遇到这种情况的解决办法:

  1. 切换到命令行窗口,或使用命令行方式启动系统

这是在你还能成功开机的情况下能进行的。上面只是我们的GUI桌面没法使用了,我们可以想办法打开我们的命令行窗口,毕竟我们linux本来就可以无GUI界面使用命令行窗口的方式启动。我使用的是centos7,我切换命令行界面的操作是ctrl+alt+F3(开机完成之后再按),其他系统你可以百度一下怎么切换到命令行界面。

  1. 将原本的文件恢复,将软链接链回之前的动态库
rm -rf libstdc++.so.6
ln -s ./libstdc++.so.6.0.19 ./libstdc++.so.6

假如你把libstdc++.so.6.0.19文件删除了的话,你可以重新去下载一个,使用①linux下载命令或者是②windows下载使用共享文件夹传进来,然后放入到/lib64文件夹中

  1. 完成上面的操作就可以重启了。重启之后就没有问题了。

解决办法2:(正确有效的方式)

我们使用LD_PRELOAD命令来设置我们运行时首先采用的动态库

  1. 这里我们下载好之前的libstdc++.so.6.0.21
  2. 设置运行时首先采用的库(进入到需要运行的程序的目录下)
export LD_PRELOAD="/lib64/libstdc++.so.6.0.21"
  1. 运行我们的程序
  2. 运行完之后我们不使用了,使用unset LD_PRELOAD取消我们的应用
unset LD_PRELOAD
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐