首页 > 代码库 > /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found 解决方法

/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found 解决方法

问题重现:当我们运行某一个用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来指明动态链接库对应的位置。