Docker Debian 环境 GCC 14.0.2 回退到 GCC 5.4 完整教程
Docker Debian 环境 GCC 14.0.2 回退到 GCC 5.4 完整教程
问题背景
最近在写 ICS2017 的 PA3,装环境时 Docker 默认拉取了 Debian 镜像,自带的 GCC 版本是 14.0.2,编译报错,需要回退到 GCC 5.4,遂有此贴。
踩坑记录
最开始,我准备直接:
sudo apt update
sudo apt-get install gcc-5.4
结果提示 Debian 版本太新,这个包早就找不到了。
于是问 GPT,让我放弃当前环境重新拉取镜像,但这样就要另外重新配置 GUI。没办法,怀着可惜的心情,我决定放弃当前环境,拉取了 Ubuntu 16.04。
拉取下来以后,准备用 VS Code SSH 连上去,又发现新版的 VS Code 好像已经不支持 Ubuntu 16.04 了,连不上环境了。
本着不想用 Vim 完成后面实验的想法,我又去找教程。某乎大佬说可以把 VS Code 回退到某个版本就能打开,回退以后居然真的有效。但是 WSL 不支持了,Remote-SSH 插件也没了,于是又更新回新版本。
又求助 GPT,说可以把本地文件挂载到环境上,本地写代码,在环境编译运行。这个主意不错,但需要在拉取镜像的时候就挂载才能用。行,于是我又重新拉取、挂载,好像还真能这样。但是执行的命令难评,而且执行结果没办法反馈给宿主机,遂放弃。
然后我意识到能不能直接在本地编译?最后还是用这个方案解决了,具体教程如下:
完整操作步骤
1. 安装依赖
sudo apt install libncurses-dev
sudo apt install bison
sudo apt install flex
sudo apt install build-essential
wget http://mirrors.ustc.edu.cn/debian/pool/main/g/gcc-6/gcc-6-base_6.3.0-18%2Bdeb9u1_amd64.deb
dpkg -i gcc-6-base_6.3.0-18+deb9u1_amd64.deb
wget http://mirrors.ustc.edu.cn/debian/pool/main/g/gcc-6/libubsan0_6.3.0-18%2Bdeb9u1_amd64.deb
dpkg -i libubsan0_6.3.0-18+deb9u1_amd64.deb
wget http://mirrors.ustc.edu.cn/debian/pool/main/g/gcc-6/libcilkrts5_6.3.0-18%2Bdeb9u1_amd64.deb
dpkg -i libcilkrts5_6.3.0-18+deb9u1_amd64.deb
可能会出现部分包下载不下来的问题,但不影响,可以继续跟着步骤做。
2. 创建目录存放 deb 文件
mkdir g5_debs
cd g5_debs
3. 下载 deb 文件
wget http://archive.ubuntu.com/ubuntu/pool/universe/g/gcc-5/cpp-cpp-55_5.5.0-12ubuntu1_amd64.deb
wget http://archive.ubuntu.com/ubuntu/pool/universe/g/gcc-5/g++-5_5.5.0-12ubuntu1_amd64.deb
wget http://archive.ubuntu.com/ubuntu/pool/universe/g/gcc-5/gcc-5_5.5.0-12ubuntu1_amd64.deb
wget http://archive.ubuntu.com/ubuntu/pool/universe/g/gcc-5/gcc-5-base_5.5.0-12ubuntu1_amd64.deb
wget http://archive.ubuntu.com/ubuntu/pool/universe/g/gcc-5/libasan2_5.5.0-12ubuntu1_amd64.deb
wget http://archive.ubuntu.com/ubuntu/pool/universe/g/gcc-5/libgcc-5-dev_5.5.0-12ubuntu1_amd64.deb
wget http://archive.ubuntu.com/ubuntu/pool/universe/g/gcc-5/libmpx0_5.5.0-12ubuntu1_amd64.deb
wget http://archive.ubuntu.com/ubuntu/pool/universe/g/gcc-5/libstdc++-5-dev_5.5.0-12ubuntu1_amd64.deb
4. 安装
sudo dpkg -i *.deb
5. 检查缺失的依赖
安装完以后执行 ls -1 *.deb,输出应为:
g++-5_5.5.0-12ubuntu1_amd64.deb
gcc-5-base_5.5.0-12ubuntu1_amd64.deb
gcc-5_5.5.0-12ubuntu1_amd64.deb
libasan2_5.5.0-12ubuntu1_amd64.deb
libgcc-5-dev_5.5.0-12ubuntu1_amd64.deb
libmpx0_5.5.0-12ubuntu1_amd64.deb
libstdc++-5-dev_5.5.0-12ubuntu1_amd64.deb
还缺以下 5 个依赖包:
cpp-5
libisl15
libtsan0
libubsan0
libcilkrts5
因为 Debian 版本太高,有些包太老了找不到,没办法直接用 sudo apt install 下载,需要在环境变量里配置国内 Ubuntu 镜像源,这里我选的是清华源:
6. 添加 Ubuntu 16.04 源(清华镜像)
sudo sh -c 'cat >> /etc/apt/sources.list <<"EOF"
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial universe
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial universe
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates universe
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates universe
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security universe
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security universe
EOF'
因为是 Debian 跨平台引用 Ubuntu 源,可能会出现 Ubuntu 16.04 签名密钥缺失的问题。本地写代码可以临时信任清华源,先把包装上:
sudo sed -i 's#^deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/#deb [trusted=yes] https://mirrors.tuna.tsinghua.edu.cn/ubuntu/#g; s#^deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/#deb-src [trusted=yes] https://mirrors.tuna.tsinghua.edu.cn/ubuntu/#g' /etc/apt/sources.list && sudo apt update
7. 安装缺失的依赖及 GCC 5.4
sudo apt install -y --allow-downgrades \
gcc-5-base=5.4.0-6ubuntu1~16.04.12 \
cpp-5=5.4.0-6ubuntu1~16.04.12 \
gcc-5=5.4.0-6ubuntu1~16.04.12 \
g++-5=5.4.0-6ubuntu1~16.04.12 \
libasan2=5.4.0-6ubuntu1~16.04.12 \
libmpx0=5.4.0-6ubuntu1~16.04.12 \
libgcc-5-dev=5.4.0-6ubuntu1~16.04.12 \
libstdc++-5-dev=5.4.0-6ubuntu1~16.04.12 \
libisl15 libtsan0=5.4.0-6ubuntu1~16.04.12 \
libubsan0=5.4.0-6ubuntu1~16.04.12 \
libcilkrts5=5.4.0-6ubuntu1~16.04.12
8. 切换默认 GCC / G++ 版本
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 54
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 54
sudo update-alternatives --set gcc /usr/bin/gcc-5
sudo update-alternatives --set g++ /usr/bin/g++-5
9. 验证结果
gcc --version
g++ --version
确认输出为 5.4.0。
补充
编辑的时候突然发现,好像阿里云直接有镜像,是不是可以直接下载?如果上面的还没解决或者感觉麻烦可以试一下,附链接:阿里云 gcc 镜像
总结
在 Docker 新版本 Debian 上回退 GCC 的核心思路是:从 Ubuntu 16.04 的镜像源中获取 GCC 5 的老版本 deb 包及依赖,通过跨源安装完成降级。虽然过程有些曲折,但最终不用重建容器、不需要额外挂载,在现有环境中即可解决问题。
希望这篇教程能帮到遇到同样问题的你!
参考
以下是我解决时参考/查询到的内容:
更多推荐
所有评论(0)