CentOS 7升级gcc版本至11.2.1

1、安装centos-release-scl

sudo yum install centos-release-scl

2、安装devtoolset,11为版本号

sudo yum install devtoolset-11-gcc*

3、临时激活对应的devtoolset,11为版本号

scl enable devtoolset-11 bash

4、永久激活软链接
11为版本号

mv /usr/bin/gcc /usr/bin/gcc-4.8.5
ln -s /opt/rh/devtoolset-11/root/bin/gcc /usr/bin/gcc
mv /usr/bin/g++ /usr/bin/g++-4.8.5
ln -s /opt/rh/devtoolset-11/root/bin/g++ /usr/bin/g++
gcc --version
g++ --version

删除软链接用rm命令

<think>我们正在处理一个关于g++编译器版本和GLIBCXX兼容性的问题。用户使用的是g++ 11.2.1,遇到了GLIBCXX_3.4.20的兼容性问题。这通常是因为程序在运行时需要GLIBCXX_3.4.20版本的符号,但当前系统中的libstdc++.so库不包含该版本(或更高版本)的符号。 可能的原因: 1. 程序是在一个较新的系统上编译的,然后在一个较旧的系统上运行。 2. 系统中存在多个g++版本,而运行时链接的库路径指向了旧版本的库。 解决步骤: 步骤1:确认问题 运行程序时,错误信息可能类似于: `./program: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version 'GLIBCXX_3.4.20' not found (required by ./program)` 步骤2:检查当前系统中的GLIBCXX版本 使用以下命令查看当前系统中libstdc++支持的GLIBCXX版本: `strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX` (注意:库路径可能因系统而异,常见路径还有`/usr/lib64/libstdc++.so.6`等) 步骤3:确认g++版本 `g++ --version` 步骤4:如果步骤2的输出中没有GLIBCXX_3.4.20,说明当前系统中的libstdc++版本过低。需要更新libstdc++或者安装更高版本的g++。 步骤5:解决方案 a) 升级系统或安装更高版本的g++ 根据不同的Linux发行版,升级命令不同。例如在Ubuntu上: sudo apt update sudo apt install gcc-11 g++-11 # 如果已经安装但版本不够新,可能需要安装更新的版本(如gcc-12等) 注意:用户当前使用的是11.2.1,但GLIBCXX_3.4.20是在gcc 5.1中引入的。所以理论上gcc 5.1以上都应该包含。但可能用户系统上的库文件没有更新。 b) 手动指定使用新版本的libstdc++ 如果系统中已经安装了高版本的g++,但是默认没有使用,可以通过设置环境变量LD_LIBRARY_PATH来指定: export LD_LIBRARY_PATH=/path/to/new/libstdc++.so.x:$LD_LIBRARY_PATH 例如,如果高版本的g++安装在/usr/local/gcc-11.2.1/lib64下,则: export LD_LIBRARY_PATH=/usr/local/gcc-11.2.1/lib64:$LD_LIBRARY_PATH 注意:这种方法可能不是永久性的,每次运行程序前都需要设置。可以将该命令添加到.bashrc中,或者将库路径添加到/etc/ld.so.conf并运行ldconfig。 c) 静态链接libstdc++ 在编译程序时,可以静态链接libstdc++,这样就不会依赖系统动态库。但这样会增大可执行文件体积。 g++ -static-libstdc++ -o program program.cpp 注意:静态链接可能会带来许可问题(libstdc++使用GPL3许可),并且如果程序是分发的,需要注意许可要求。 步骤6:验证 重新运行程序,或者使用以下命令检查程序依赖的库版本: ldd program objdump -p program | grep NEEDED # 也可以查看需要的动态库 另外,如果升级了g++,需要确保编译时使用的是新版本的g++,并且新版本的库在运行时被正确链接。 注意:如果用户是在一个较旧的操作系统上(如CentOS 7)需要运行需要高版本GLIBCXX的程序,可能需要考虑使用devtoolset或者升级整个系统。 引用参考:在解决此类问题时,社区通常建议使用更高版本的编译器或更新系统库[^1]。 生成相关问题1. 如何查看一个可执行文件依赖的GLIBCXX版本2. 如何在同一个系统中安装多个gcc版本并切换? 3. 静态链接libstdc++会有什么潜在问题?</think>### GLIBCXX_3.4.20 兼容性问题解决方案 您遇到的 `GLIBCXX_3.4.20` 版本问题通常是由于 **编译环境** 和 **运行环境** 的 libstdc++ 库版本不一致导致的。以下是系统级排查和解决方案: --- #### **1. 确认问题根源** ```bash # 检查程序依赖的 GLIBCXX 版本 objdump -p your_program | grep GLIBCXX # 输出示例:GLIBCXX_3.4.20(表示程序需要此版本) # 查看当前系统的 libstdc++.so.6 支持版本 strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX ``` - 若输出结果**不包含** `GLIBCXX_3.4.20`,说明系统版本过低。 --- #### **2. 解决方案** ##### ▶ 方案一:升级 libstdc++ 库 ```bash # 安装高版本 libstdc++ (以 Ubuntu 为例) sudo apt install libstdc++6 ``` - **验证**:重新运行 `strings` 命令检查是否包含所需版本。 ##### ▶ 方案二:静态链接 libstdc++(推荐) 在编译时强制静态链接库: ```bash g++ -static-libstdc++ -o your_program your_code.cpp ``` - **优点**:消除运行时依赖 - **代价**:二进制文件体积增大 ##### ▶ 方案三:指定库路径 ```bash # 将高版本库复制到程序目录 cp /path/to/new/libstdc++.so.6 ./lib/ # 运行前设置加载路径 export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH ./your_program ``` --- #### **3. 版本兼容性说明** | GCC 版本 | 引入的 GLIBCXX | 发布时间 | |----------|----------------|----------| | GCC 5.1 | GLIBCXX_3.4.20 | 2015 | | GCC 11.2 | GLIBCXX_3.4.29 | 2021 | - **关键结论**: GLIBCXX_3.4.20 在 GCC 5.1 引入,若您的系统 GCC 版本低于 5.1,则必须升级或静态链接[^1]。 --- #### **4. 验证修复** ```bash # 检查修复后程序的依赖项 ldd your_program | grep libstdc++ # 输出应指向静态库或正确路径 # 检查符号版本 objdump -p your_program | grep GLIBCXX ``` --- ### 相关问题 1. 如何查看 Linux 系统已安装的 GLIBCXX 版本列表? 2. 静态链接 libstdc++ 会带来哪些潜在风险? 3. 在 Docker 容器中如何解决 GLIBCXX 兼容性问题? [^1]: GLIBCXX 版本GCC 的对应关系参考 [GCC ABI Policy](https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Higer2008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值