`GLIBCXX_3.4.21' not found
1 | /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /usr/local/bin/a.out) |
程序运行是加载的
libstdc++
库版本低, 解决方法直接升级gcc版本
检查引用库GLIBCXX版本
1 | strings /usr/lib64/libstdc++.so.6|grep GLIBCXX |
CentOS升级gcc
安装gcc9
1 | yum -y install centos-release-scl |
可以安装多个版本,使用时自由切换
切换gcc版本
1 | scl enable devtoolset-9 bash |
libstdc++
安装后的文件:/opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/libstdc++.so
程序运行时加载库的流程
升级完成gcc后,切换到高版本进行编译后,可以正常运行,但是此时系统中存在多个libstdc++
库,它是如何找到那个高版本库加载的?
1 | ldd /usr/local/bin/a.out | grep c++ |
ldd查看其依赖库依然是/lib64/libstdc++.so.6
,这个gcc低版本库,正常应该是不能运行的,但是此时程序运行是正常的(使用系统默认gcc编译后无法正常运行)。
1 | strings /opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/libstdc++.so |
通过strings
查看该库时,发现以上信息。个人理解应该是再切换了编译器后,在编译时将部分代码结构,以静态的方式直接编译到了可执行程序中,这样在运行时即使加载旧的libstdc++
库,也可以正常运行。