Ubuntu编译C++程序拷贝至CentOS报GLIBCXX_3.4.21缺失问题求解
解决Ubuntu编译C++程序在CentOS运行时GLIBCXX_3.4.21缺失的问题
这个问题我碰到过好多次了,很多人容易把glibc和libstdc搞混,先给你理清楚核心原因:你看到的glibc 2.23是GNU C标准库的版本,但报错里的GLIBCXX_3.4.21是**GNU C标准库(libstdc++)**的版本标识,这俩是完全不同的库!
为什么CentOS会报这个错?
- Ubuntu的默认gcc版本通常比CentOS新很多:比如Ubuntu 16.04用的gcc 5.x,而CentOS 7默认的gcc是4.8.5,对应的libstdc++最高只支持到
GLIBCXX_3.4.19,GLIBCXX_3.4.21是gcc 5.x才引入的版本标识。 - 你在Ubuntu上编译程序时,默认动态链接了系统的libstdc++,把二进制拷到CentOS后,系统找不到高版本的libstdc++,就会触发报错。
可行的解决方案
1. 静态链接libstdc++(最简单直接)
编译时给gcc/g加上-static-libstdc++选项,把libstdc的代码直接打包到二进制文件里,这样就不依赖CentOS系统的libstdc++了:
g++ your_program.cpp -o your_program -static-libstdc++
注意:这个选项只静态链接libstdc++,其他库(比如glibc)还是动态链接的,如果glibc版本差异也导致问题,可能需要加-static(但静态编译整个程序会让二进制变大,且可能有其他兼容性问题)。
2. 在CentOS上升级libstdc++(不覆盖系统默认)
直接替换系统默认的libstdc++可能会搞崩系统(比如yum等工具依赖旧版本),推荐安全的方式:
- 从CentOS的SCL软件集安装高版本gcc(比如gcc 5/6/7),这样会在
/opt/rh/下生成独立的libstdc++库,运行程序时指定库路径:# 以CentOS7为例,安装gcc 5 yum install centos-release-scl yum install devtoolset-5-gcc-c++ # 运行程序时加载对应的库环境 scl enable devtoolset-5 ./your_program - 或者手动下载对应版本的
libstdc++.so.6,放到程序所在目录,然后设置环境变量指定库路径:
也可以编译时用LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./your_program-Wl,-rpath=./选项,让程序启动时自动加载当前目录的库。
3. 交叉编译(最规范的方式)
在Ubuntu上安装CentOS对应的交叉编译工具链,编译出适合CentOS系统的二进制:
- 可以用
devtoolset的交叉编译包,或者直接下载CentOS的gcc源码编译成交叉工具链,确保编译环境的libstdc++版本和CentOS一致。
额外检查步骤
先在CentOS上确认系统支持的GLIBCXX版本,执行命令:
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
输出里如果没有GLIBCXX_3.4.21,就说明系统确实不支持,需要用上面的方法解决。
内容的提问来源于stack exchange,提问作者vico
相关产品推荐
相关产品推荐

