当前位置: 首页 > news >正文

gcc升级问题

        gcc是GNU项目开源的编译器套件,最初仅支持C语言linux中的默认标准编译器,后扩展为支持C++、Fortran、Ada、Go等十多种编程语言。它在Linux中是默认的标准编译器,负责将源代码转换为可执行文件,涵盖预处理、编译、汇编、链接等步骤

  • 已安装最新版本的gcc,为什么程序运行时还是提示“库版本过低”

通过gcc -v 确认编译器版本是符合文档要求,但是运行时还是显示libstdc++.so6版本太低

img

原因如下:

1.GCC编译器和运行时库(如libstdc++.so.6)是分离的。安装新GCC时,旧版系统库可能未被替换,导致程序任链接到旧库。系统中的/lib64/libstdc++.so.6文件实际指向的库版本较低。

  • 即使通过源码或包管理器安装了新版GCC(如GCC 10.2.0),默认不会替换系统默认库路径(/lib64/)下的libstdc++.so.6(因为该文件被旧版GCC或系统关键组件占用)。

  • 新版GCC的库通常安装在独立目录(如/usr/local/lib64/),而系统运行时默认加载的是/lib64/下的旧库。

Wstrings /usr/lib64/libstdc++.so.6 | grep GLIBCXX  # 查看支持的库版本

2.多版本的GCC共存导致路径混淆

系统可能同时存在多个GCC版本(如通过源码安装新版,旧版保留)。若环境变量LD_LIBRARY_PATH未指向新版库路径,程序任加载旧库。或者未更新动态库缓存(ldconfig),导致程序加载旧库。

echo $LD_LIBRARY_PATH  # 查看库搜索路径
find / -name "libstdc++.so*" 2>/dev/null  # 查找所有库文件位置

解决方案:

方法1:手动链接新版库到系统目录(推荐)
方法将高版本GCC提供的libstdc++.so.6软链接到系统库目录(需root权限)。操作前务必备份旧库!
# 1. 查找新版libstdc++.so.6的具体路径(例如GCC 10.2.0的库)
find / -name "libstdc++.so*" 2>/dev/null | grep -P 'libstdc\+\+.so.6\..*'
​
# 示例输出(根据实际安装路径调整):
# /usr/local/gcc-10.2.0/lib64/libstdc++.so.6.0.28
​
# 2. 备份旧库(避免操作失误导致系统故障)
sudo mv /lib64/libstdc++.so.6 /lib64/libstdc++.so.6.bak
​
# 3. 创建新库软链接
sudo ln -s /usr/local/gcc-10.2.0/lib64/libstdc++.so.6.0.28 /lib64/libstdc++.so.6
​
# 4. 更新动态库缓存
sudo ldconfig
​
# 5. 验证新版本是否生效
strings /lib64/libstdc++.so.6 | grep 'CXXABI_.*\..'
​
# 检查输出中应包含`CXXABI_1.3.9`,例如:
# CXXABI_1.3.9
# CXXABI_1.3.10
方法2:通过环境变量指定库路径(临时使用)

若不想修改系统库(如生产环境无root权限),可设置LD_LIBRARY_PATH指向新版库目录:

# 假设新版库路径为:/usr/local/gcc-10.2.0/lib64/
export LD_LIBRARY_PATH=/usr/local/gcc-10.2.0/lib64:$LD_LIBRARY_PATH
​
# 再运行程序
./utsdaemon.out
​
# 永久生效:将上述export命令添加到用户profile(~/.bashrc或~/.bash_profile)
方法3:使用包管理器升级系统库(CentOS/RHEL)

若新版GCC来自官方仓库,尝试直接升级libstdc++包:

# 查看已安装版本
rpm -q libstdc++
​
# 升级到最新版本
sudo yum update libstdc++
​
# 重启或重新登录(部分程序需重启)

关键验证步骤:

  • 检查库实际版本

strings /lib64/libstdc++.so.6 | grep 'CXXABI_.*\..'
#若输出中包含CXXABI_1.3.9,则问题已解决

软链接是什么

软链接就是相当于windows中的快捷方式,通过链接到指定的可执行文件。

linux环境变量

修改环境变量后,执行 source /etc/profile 会重新新增部分环境变量值,重启服务器后恢复,重复的不影响。

/etc/profile中多个value,用":"隔开。

相关文章:

  • Web第二次方向考核复盘
  • MacBook命令行提示符添加git分支信息
  • Git(三) Git 分支工作流管理模型探究与实践
  • C语言空指针异常在Java中的解决方案
  • 深入理解IOC与DI
  • CPU的异常处理
  • java读取yml配置文件2
  • iOS —— UI(2)
  • 机器学习模型评估与选择
  • java基础面试题。
  • Grdle版本与Android Gradle Plugin版本, Android Studio对应关系
  • GRPO训练布局感知的强化学习多模态文档解析框架-Infinity-Parser
  • 【速写】policy与reward分词器冲突问题(附XAI阅读推荐)
  • web性能优化
  • 电感篇---常见作用
  • 黑马python(六)
  • houdini 简单流体模拟 学习笔记
  • windows server部署.net项目(nopcommerce)
  • 1.2、不同的波段对于传送网有什么意义
  • C语言主要关键字及其用途
  • 武昌网站建设/锦绣大地seo
  • dede怎么做视频网站/营销手段有哪些
  • 微信微网站是什么/百度推广seo效果怎么样
  • wordpress single cat/搜狗seo软件
  • 网站营销单页怎么做/杭州网站seo公司
  • 网站分类 维护/网站运营推广选择乐云seo