不删该任何文件解决 “/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found “

来源:互联网 发布:权限管理的软件 编辑:程序博客网 时间:2024/05/20 10:20


当我们运行某一个用C系列语言编译而成的程序的时候,可能会接收到这个错误——这个错误的意思是,没有找到GLIBC版本是3.4.14的相应C++标准库。

问题起源:首先,我们需要清楚,一个程序从被加载之后,需要进行动态链接,而动态链接,需要对应版本的glibc库。但是我们的可执行文件需要哪个版本的glibc库呢?

这个版本问题,已经存在于我们的可执行文件ELF格式中。我们可以用命令这样查看。

[22:10huangyk@leetcode]$>strings numDistinct | grep GLIB 
GLIBC_2.2.5 
GLIBCXX_3.4.5 
GLIBCXX_3.4.14 
GLIBCXX_3.4 

好了,我们看到了ELF文件加载需要的GLIB库版本。这些版本信息是什么时候被加进去的呢?

答案:是在使用gcc编译程序的时候被加进去的。也就是说,如果两个平台的GLIBC库版本不同,同时GCC版本不同,那么它们的二进制文件是不能通用的。

问题:到什么地方去找安装在本地的GLIBC库呢?又如何寻找对应版本呢?

答案:默认的动态链接库,存放的路径是/usr/lib64/libstdc++.so.6。但是,如果我们自己编译了GCC,对应的libc和libc++的库文件位置就会发生变化。假如我们的安装路径是 /usr/local/gcc4.8.3, 那么 对应的库文件位置是/usr/local/gcc4.8.3/lib:/usr/local/gcc4.8.3/lib64.

问题:为什么我已经安装了对应的GLIBC库,但是仍然出现上述错误呢?

答案:虽然我们已经安装了对应的库,但是连接器不能顺利找到新库所在的位置。还会接着到原来的目录/usr/lib64/libstdc++.so.6寻找对应的文件。所以, 我们需要借助环境变量LD_LIBRARY_PATH来指明动态链接库对应的位置。

方法1,

http://blog.csdn.net/xiaolong2w/article/details/23915171


linux strings 命令——ELF文件格式与“链接和装载”

http://blog.csdn.net/trochiluses/article/details/29425337


方法2:

利用update-alternative 改变lidstc++.so.6 链接对象,在默认情况下libstdc++.so.6 软连接到urs/lib(或lib64)/libstdc++.so.6.0.13 ,而自行安装的更高版本的gcc 往往在/usr/local/lib(或lib64)下,通常处理是删除原有的libstdc++.so.6->libstdc++.so.6.0.13 ,新建libstdc++.so.6->/usr/local/lib64/libstdc++.so.6.0.17,这种方法血腥味太重,用update-alternative 改变lidstc++.so.6 链接对象,就显得和谐多了,步骤如下:

 update-alternatives --install /usr/lib64/libstdc++.so.6 libstdc++.so.6 /usr/local/lib64/libstdc++.so.6 40

用update-alternatives --config  libstdc++.so.6 选择你想要的软 链接

文章地址:http://blog.csdn.net/tlm414/article/details/54914916

0 0
原创粉丝点击