Linux系统ubuntu22.04安装最新版的gcc13.1.0编译器,支持c++20、23

本文详细记录了在Ubuntu22.04系统中手动安装GCC13.1.0编译器的过程,包括下载、解压、配置、编译和安装步骤。在安装完成后,遇到了C++程序运行时缺少GLIBCXX_3.4.31的问题。通过查找和分析,作者发现系统中缺少相应版本的libstdc++.so.6库,并通过创建新软链接解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux系统ubuntu22.04安装最新版的gcc13.1.0编译器,支持c++20、23

本文全程实操,上机验证通过。

  1. 首先查看gcc版本,以确保系统内有gcc,如果没有需要安装sudo apt install gcc

  2. 去GUN官网查看最新的gcc版本Index of /gnu/gcc

    在这里插入图片描述

  3. 下载最新版本,可以在线下载,也可以去官网下载包拖到linux系统下,看到网上说Ubuntu22.10版本可以直接在线安装,具体不清楚,我用的是22.04:

    wget http://ftp.gnu.org/gnu/gcc/gcc-13.1.0/gcc-13.1.0.tar.gz
    
  4. 解压:

     tar xf gcc-13.1.0.tar.gz
    
  5. 进入目录,安装组件,时间有点久,执行完没反应,因为在下载包,所以不要看没反应直接ctrl+c:

    cd gcc-13.1.0/
    ./contrib/download_prerequisites
    

    安装组件时,可能由于网络问题导致组件安装失败,这时候需要删除失败组件包,重新安装。

    在这里插入图片描述

    我在安装的时候还出现了下图情况,解法也在图中。在这里插入图片描述

  6. 创建构建目录:

    mkdir build && cd build
    
  7. 执行安装并指定安装位置,不指定会安装在/usr/bin/目录下,下面命令没有指定位置(我试过指定位置,后续会比较烦)

    ../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib
    
  8. 编译,我这里用sudo提升权限编译的,不用我会编译失败,-j8采用8线程(主要看你的cpu是几线程,如果不加线程,慢的受不了想砸电脑),我这里编译了30多分钟:

    sudo make -j8 
    
  9. 安装:

    sudo make install
    
  10. 正常情况下,到此就安装完成,执行gcc -v会出现最新的版本,如果没出现建议重启试一下。

    wy@DESKTOP-PBM4A2J:~/code$ gcc -v 
    Using built-in specs.
    COLLECT_GCC=gcc
    COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/13.1.0/lto-wrapper
    Target: x86_64-pc-linux-gnu
    Configured with: ../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib
    Thread model: posix
    Supported LTO compression algorithms: zlib
    gcc version 13.1.0 (GCC) 
    
  11. 但是,我遇到这样的一种情况,我尝试着编译c++代码,编译可以通过(开心),但是到执行的时候,报错!(难受)在这里插入图片描述

    提示缺少GLIBCXX_3.4.31。通过strings命令查看的确缺少(如上图所示),md心态崩了!

    1. 首先使用locate libstdc++.so.6 查看一下

      wy@DESKTOP-PBM4A2J:/usr/lib/x86_64-linux-gnu$ locate libstdc++.so.6 
      /home/wy/code/gcc-13.1.0/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
      /home/wy/code/gcc-13.1.0/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.31
      /home/wy/code/gcc-13.1.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
      /home/wy/code/gcc-13.1.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.31
      /home/wy/code/gcc-13.1.0/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
      /home/wy/code/gcc-13.1.0/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.31
      /usr/lib/x86_64-linux-gnu/libstdc++.so.6
      /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30
      /usr/local/lib64/libstdc++.so.6
      /usr/local/lib64/libstdc++.so.6.0.31
      /usr/local/lib64/libstdc++.so.6.0.31-gdb.py
      /usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30-gdb.py
      
    2. 我的猜想是,它不是提示缺少31版本嘛,我们此时/usr/lib/x86_64-linux-gnu/libstdc++.so只有30版本,所以我想能不能在so.31中找到。于是我果然在/home/wy/code/gcc-13.1.0/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.31路径下找到了31版本。

      wy@DESKTOP-PBM4A2J:~/code$ strings /home/wy/code/gcc-13.1.0/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.31 | grep GLIBCXX_3.4.31
      GLIBCXX_3.4.31
      
    3. 查看依赖关系:

      wy@DESKTOP-PBM4A2J:/usr/lib/x86_64-linux-gnu$ locate libstdc++.so.6 | xargs ls -al 
      lrwxrwxrwx 1 root root       19 Jul 14 16:31 /home/wy/code/gcc-13.1.0/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6 -> libstdc++.so.6.0.31
      -rwxr-xr-x 1 root root 20553776 Jul 14 16:31 /home/wy/code/gcc-13.1.0/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.31
      lrwxrwxrwx 1 root root       19 Jul 14 16:04 /home/wy/code/gcc-13.1.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6 -> libstdc++.so.6.0.31
      -rwxr-xr-x 1 root root 20553776 Jul 14 16:04 /home/wy/code/gcc-13.1.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.31
      lrwxrwxrwx 1 root root       19 Jul 14 16:48 /home/wy/code/gcc-13.1.0/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6 -> libstdc++.so.6.0.31
      -rwxr-xr-x 1 root root 20553776 Jul 14 16:48 /home/wy/code/gcc-13.1.0/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.31
      lrwxrwxrwx 1 root root       19 May 13  2022 /usr/lib/x86_64-linux-gnu/libstdc++.so.6 -> libstdc++.so.6.0.30
      -rw-r--r-- 1 root root  2252096 May 13  2022 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30
      lrwxrwxrwx 1 root root       19 Jul 14 17:01 /usr/local/lib64/libstdc++.so.6 -> libstdc++.so.6.0.31
      -rwxr-xr-x 1 root root 20553776 Jul 14 17:01 /usr/local/lib64/libstdc++.so.6.0.31
      -rw-r--r-- 1 root root     2398 Jul 14 17:01 /usr/local/lib64/libstdc++.so.6.0.31-gdb.py
      -rw-r--r-- 1 root root     2387 May 13  2022 /usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30-gdb.py
      

      可以看到/usr/lib/x86_64-linux-gnu/libstdc++.so.6 -> libstdc++.so.6.0.30。这也就是为什么我执行./a.out报错的原因。那么我们把/usr/lib/x86_64-linux-gnu/libstdc++.so.6 连接到31版本应该就可以了。首先我把有31版本的包复制到/usr/lib/x86_64-linux-gnu/目录下。

    4. 删除原来的软连接,建立新的软连接

      wy@DESKTOP-PBM4A2J:/usr/lib/x86_64-linux-gnu$ sudo rm libstdc++.so.6
      wy@DESKTOP-PBM4A2J:/usr/lib/x86_64-linux-gnu$ sudo ln -sf libstdc++.so.6.0.31 libstdc++.so.6
      
    5. 重新查看一下依赖关系

      wy@DESKTOP-PBM4A2J:/usr/lib/x86_64-linux-gnu$ locate libstdc++.so.6 | xargs ls -al 
      lrwxrwxrwx 1 root root       19 Jul 14 16:31 /home/wy/code/gcc-13.1.0/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6 -> libstdc++.so.6.0.31
      -rwxr-xr-x 1 root root 20553776 Jul 14 16:31 /home/wy/code/gcc-13.1.0/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.31
      lrwxrwxrwx 1 root root       19 Jul 14 16:04 /home/wy/code/gcc-13.1.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6 -> libstdc++.so.6.0.31
      -rwxr-xr-x 1 root root 20553776 Jul 14 16:04 /home/wy/code/gcc-13.1.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.31
      lrwxrwxrwx 1 root root       19 Jul 14 16:48 /home/wy/code/gcc-13.1.0/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6 -> libstdc++.so.6.0.31
      -rwxr-xr-x 1 root root 20553776 Jul 14 16:48 /home/wy/code/gcc-13.1.0/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.31
      lrwxrwxrwx 1 root root       19 Jul 14 18:10 /usr/lib/x86_64-linux-gnu/libstdc++.so.6 -> libstdc++.so.6.0.31
      -rw-r--r-- 1 root root  2252096 May 13  2022 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30
      lrwxrwxrwx 1 root root       19 Jul 14 17:01 /usr/local/lib64/libstdc++.so.6 -> libstdc++.so.6.0.31
      -rwxr-xr-x 1 root root 20553776 Jul 14 17:01 /usr/local/lib64/libstdc++.so.6.0.31
      -rw-r--r-- 1 root root     2398 Jul 14 17:01 /usr/local/lib64/libstdc++.so.6.0.31-gdb.py
      -rw-r--r-- 1 root root     2387 May 13  2022 /usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30-gdb.py
      
    6. ok,大功告成。执行程序不会报错了。

  12. 说实话,安装这个gcc13.1.0版本,弄了两天,各种搜索方法,也踩了各种坑。尤其是那些抄博客的,都不上机验证,看这种博客真的很浪费时间。

原创非常不易,禁止转载!欢迎点赞收藏。

<think>好的,我现在需要帮助用户解决关于“libstdc++.so.6版本太高”的问题。首先,我需要理解用户的具体情况。用户可能在运行某个程序时遇到了动态链接库版本不兼容的问题,错误提示可能类似于“libstdc++.so.6: version `GLIBCXX_3.4.30' not found”,这表明系统安装的libstdc++.so.6库版本低于程序编译时使用的版本。 接下来,我要分析可能的原因。常见的情况是用户的环境中的GCC运行时库(libstdc++.so.6)版本较旧,而程序是使用更新的GCC版本编译的,导致依赖的符号不存在。例如,用户可能在旧版的Ubuntu或CentOS上运行一个在新版系统上编译的程序。 然后,我需要考虑解决方案。通常有几种方法:更新系统GCC以获取新版本的库,手动安装高版本GCC并指定库路径,或者使用静态链接。不过,用户提到的是“版本太高”,这可能有不同的情况,比如用户的环境中的库版本过高,而程序需要旧版本?但这种情况比较少见,因为高版本通常向下兼容。可能用户是反向情况,即程序需要更高版本,而系统中版本太低。但用户的问题描述是“版本太高”,所以可能需要确认具体情况。 不过,根据常见问题,“libstdc++.so.6版本太高”可能是指运行环境中的库版本比程序编译时的版本高,导致兼容性问题?但一般来说,高版本的库会向后兼容。可能用户遇到的是其他问题,比如程序依赖的特定符号在现有库中不存在,即使库版本号较高,但实际缺少某些符号,这可能是因为库文件损坏或不完整,或者用户误操作导致版本混乱。 或者,用户可能在尝试运行一个较旧程序,而系统中的libstdc++.so.6已经更新到新版本,但旧程序需要旧版本的某些符号。这种情况比较少见,因为libstdc++通常保持ABI向后兼容。不过,某些情况下,特别是使用C++11后的ABI变化,可能导致问题,但通常需要编译器标志来处理。 现在,我需要整理可能的解决方案。首先,检查当前系统中的libstdc++.so.6版本,确认是否存在所需符号。用户可以使用命令`strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX`来查看支持的版本。如果发现缺失所需的版本(如GLIBCXX_3.4.30),则需要安装更高版本的libstdc++.so.6。 解决方案可能包括:安装更新的GCC版本,将新版本的libstdc++.so.6复制到系统库路径,或者设置LD_LIBRARY_PATH指向包含所需库版本的目录。此外,静态链接也是一个选项,但可能增加二进制文件大小。 另外,需要考虑用户是否有权限安装软件包。如果用户没有root权限,可能需要手动下载并指定库路径。例如,从GCC官方下载对应版本的库文件,然后设置环境变量。 同时,需要注意不同Linux发行版的包管理工具,如Ubuntu的apt,CentOS的yum等,安装方式可能不同。例如,在Ubuntu上,可以添加PPA源来安装较新的GCC版本,而在CentOS上可能需要使用devtoolset。 此外,用户可能误操作导致符号链接错误,例如libstdc++.so.6指向了错误的版本,需要检查符号链接是否正确。可以使用`ls -l /usr/lib/x86_64-linux-gnu/libstdc++.so.6`查看链接是否指向正确的库文件。 还要考虑多版本共存的情况,如何让程序正确找到所需的库版本。可能需要使用update-alternatives来管理不同版本的库,或者使用patchelf修改二进制文件的rpath。 最后,需要提醒用户在升级库时需谨慎,避免影响系统其他依赖库的应用程序。建议在容器或虚拟环境中进行测试,或者使用应用程序自带的库文件。</think>以下是关于"libstdc++.so.6版本太高"问题的详细解决方案: --- ### 核心问题分析 当出现`libstdc++.so.6`版本相关错误时,通常存在两种典型场景: 1. **环境版本过高**:当前系统GCC运行时库版本 > 程序编译时使用的版本(较少见) 2. **环境版本过低**:当前系统GCC运行时库版本 < 程序编译时使用的版本(更常见) 您遇到的错误提示可能表现为: ```bash error: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.30' not found ``` --- ### 第一步:验证真实问题 ```bash # 查看当前支持的GLIBCXX版本 strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX # 查看程序依赖的版本(替换your_app) objdump -p your_app | grep -i needed ``` --- ### 场景一:系统库版本过高(需降级) **适用情况**:程序明确要求旧版ABI(罕见但可能) #### 解决方案 ```bash # 安装多版本库(Ubuntu示例) sudo apt install libstdc++6=12.3.0-1ubuntu1~22.04 # 创建版本切换符号链接 sudo ln -sf /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30 /usr/lib/x86_64-linux-gnu/libstdc++.so.6 # 验证链接 ls -l /usr/lib/x86_64-linux-gnu/libstdc++.so.6 ``` --- ### 场景二:系统库版本过低(需升级) **适用情况**:程序需要更新版ABI(最常见) #### 方案1:通过包管理器升级 ```bash # Ubuntu/Debian sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt install gcc-13 g++-13 libstdc++6 # CentOS/RHEL sudo yum install devtoolset-12-gcc-c++ scl enable devtoolset-12 bash ``` #### 方案2:手动部署新版库 ```bash # 下载GCC 13.2.0预编译库 wget http://mirror.koddos.net/gcc/releases/gcc-13.2.0/libstdc++-13.2.0-linux-x86_64.tar.gz # 解压并部署 tar -xzvf libstdc++-13.2.0-linux-x86_64.tar.gz sudo cp libstdc++.so.6.0.30 /usr/lib64/ sudo ldconfig ``` #### 方案3:容器化运行 ```bash # 使用新版基础镜像 docker run -it ubuntu:23.10 ./your_app # 或构建专用镜像 FROM ubuntu:22.04 RUN apt update && apt install -y libstdc++6=13.1.0-1ubuntu1 COPY your_app / CMD ["/your_app"] ``` --- ### 临时解决方案(不推荐长期使用) ```bash # 指定库路径运行 LD_LIBRARY_PATH=/path/to/new_libs ./your_app # 静态链接编译(需重新编译) g++ -static-libstdc++ -o your_app your_source.cpp ``` --- ### 版本兼容性对照表 | GCC版本 | GLIBCXX最高版本 | 发布时间 | |---------|-----------------|----------| | 4.8 | GLIBCXX_3.4.19 | 2013 | | 5.5 | GLIBCXX_3.4.22 | 2018 | | 9.4 | GLIBCXX_3.4.28 | 2022 | | 12.3 | GLIBCXX_3.4.30 | 2023 | | 13.1 | GLIBCXX_3.4.31 | 2023 | --- ### 疑难排查指南 1. **ABI兼容性检查** ```bash # 查看符号兼容性 nm -D your_app | c++filt | grep 'U std::' ``` 2. **多版本共存管理** ```bash # 查看已安装版本 update-alternatives --config libstdc++.so.6 # 强制使用特定版本 sudo update-alternatives --set libstdc++.so.6 /opt/gcc13/lib64/libstdc++.so.6 ``` 3. **运行时监控** ```bash # 追踪库加载过程 LD_DEBUG=libs ./your_app 2>&1 | grep libstdc++ ``` --- ### 长期解决方案建议 1. **统一构建环境**:在Docker中标准化构建流程 2. **ABI策略管理**:使用`-D_GLIBCXX_USE_CXX11_ABI=0`保持兼容 3. **版本冻结**:通过`apt-mark hold libstdc++6`锁定关键版本 请根据实际错误信息选择对应解决方案,如果仍有问题,请提供: 1. `gcc --version`输出 2. `ldd --version`输出 3. 完整的错误日志信息
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值