最近在Ubuntu 20.04上编译的时候遇到了问题,发现默认的GCC 9.4版本太老了,编译不过。折腾了一番,总算把GCC升级到了11.1.0,这里记录一下完整的升级过程,希望能帮到遇到同样问题的朋友。
注意事项:
升级前建议备份重要数据某些依赖旧版本GCC的软件可能需要重新编译生产环境升级需要充分测试一、快速升级方法(推荐)如果你只是想快速升级到GCC 11,可以直接用这个方法:
代码语言:bash复制# 添加PPA源
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
# 更新包列表
sudo apt-get update
# 卸载旧版本
sudo apt remove gcc-9 g++-9
sudo apt autoremove
# 安装新版本
sudo apt-get install gcc-11 g++-11
# 设置软链接
sudo ln -sf /usr/bin/gcc-11 /usr/bin/gcc
sudo ln -sf /usr/bin/g++-11 /usr/bin/g++
# 验证版本
gcc -v执行完这些命令后,GCC应该就升级到11.1.0了。
二、详细升级步骤1. 添加PPA源Ubuntu官方源里的GCC版本比较保守,要安装新版本需要添加第三方PPA源:
代码语言:bash复制sudo add-apt-repository ppa:ubuntu-toolchain-r/test2. 更新系统包列表添加新源后,需要更新包列表:
代码语言:bash复制sudo apt update3. 安装指定版本的GCC可以选择安装GCC 11、12或13:
代码语言:bash复制# 安装GCC 11
sudo apt install gcc-11 g++-11
# 或者安装GCC 12
sudo apt install gcc-12 g++-12
# 或者安装GCC 13
sudo apt install gcc-13 g++-134. 配置默认版本方法一:使用软链接(简单)代码语言:bash复制sudo ln -sf /usr/bin/gcc-11 /usr/bin/gcc
sudo ln -sf /usr/bin/g++-11 /usr/bin/g++方法二:使用update-alternatives(推荐)这种方法可以方便地在多个版本间切换:
代码语言:bash复制# 安装update-alternatives(通常已经安装)
sudo apt install update-alternatives
# 配置GCC版本管理
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 60 --slave /usr/bin/g++ g++ /usr/bin/g++-11
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 40 --slave /usr/bin/g++ g++ /usr/bin/g++-9
# 选择默认版本
sudo update-alternatives --config gcc5. 验证安装代码语言:bash复制gcc --version
g++ --version应该能看到类似这样的输出:
代码语言:bash复制gcc (Ubuntu 11.1.0-2ubuntu2~20.04) 11.1.0三、常见问题及解决方案问题1:软件源下载太慢更换国内镜像源先备份原来的源:
代码语言:bash复制sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak编辑源文件:
代码语言:bash复制sudo vim /etc/apt/sources.list清华大学源(Ubuntu 22.04 jammy):
代码语言:bash复制# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse阿里云源(Ubuntu 20.04 focal):
代码语言:bash复制deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse更新源:
代码语言:bash复制sudo apt-get update
sudo apt-get upgrade问题2:PPA源下载慢替换PPA镜像方法一:手动替换
代码语言:bash复制# 编辑sources.list,将ppa.launchpad.net替换为国内镜像
sudo sed -i 's/ppa.launchpad.net/launchpad.proxy.ustclug.org/g' /etc/apt/sources.list方法二:替换sources.list.d中的PPA源
代码语言:bash复制# 查看PPA源文件
ls /etc/apt/sources.list.d/
# 批量替换
sudo sed -i "s/ppa.launchpad.net/launchpad.proxy.ustclug.org/g" /etc/apt/sources.list.d/*.listDocker环境中的处理:
代码语言:bash复制# 在Dockerfile中添加PPA源后立即替换
apt-add-repository -y ppa:ubuntu-toolchain-r/test
sed -i "s/ppa.launchpad.net/launchpad.proxy.ustclug.org/g" /etc/apt/sources.list.d/*.list问题3:dpkg包管理错误如果遇到类似这样的错误:
代码语言:bash复制dpkg-deb: 错误: 粘贴 子进程被信号(断开的管道) 终止了
在处理时有错误发生:
/var/cache/apt/archives/xxx.deb解决方法:
代码语言:bash复制# 强制覆盖安装
sudo dpkg -i --force-overwrite "/var/cache/apt/archives/xxx.deb"
# 然后继续安装
sudo apt-get install -f四、PPA源管理什么是PPAPPA(Personal Package Archives)是Ubuntu Launchpad提供的个人软件包仓库服务,允许开发者发布官方源中没有的软件包。
添加PPA源代码语言:bash复制sudo add-apt-repository ppa:用户名/ppa名称
sudo apt-get update删除PPA源代码语言:bash复制# 命令行删除
sudo add-apt-repository -r ppa:用户名/ppa名称
# 手动删除文件
cd /etc/apt/sources.list.d
ls # 查看PPA源文件
sudo rm ppa文件名.list # 删除对应文件
# 更新源
sudo apt-get update通过以上步骤,我们成功将Ubuntu 20.04的GCC从9.4升级到了11.1.0。整个过程中最容易遇到的问题就是网络下载慢,通过更换国内镜像源可以很好地解决这个问题。希望这篇文章能帮到遇到类似问题的朋友!
参考:https://github.com/apernet/tcp-brutal/issues/7
https://blog.csdn.net/x1131230123/article/details/132544277
https://blog.csdn.net/LangLang_2020/article/details/134195060
https://blog.csdn.net/shuizhongmose/article/details/125390322
https://www.cnblogs.com/zhaoyingjie/p/17150416.html
https://www.zhihu.com/question/382334154/answer/1131393495
https://www.cnblogs.com/jiftle/p/14121582.html
https://www.fujieace.com/kali-linux/dpkg-deb-2.html