Ubuntu20.04.3中安装gcc-4.8.5,gcc多版本共存

背景:

公司c++后端项目部署环境是在基站设备(centos xx版本),要求使用gcc-4.8.5编译。我的开发环境是ubuntu20.04.3,自带gcc版本为9.3.0。因此需要安装gcc-4.8.5.

zz@zz-VirtualBox:~$ lsb_release -a
No LSB modules are available.
Distributor ID:    Ubuntu
Description:    Ubuntu 20.04.3 LTS
Release:    20.04
Codename:    focal

gcc/g++版本信息,均为9.3.0:
Ubuntu20.04.3中安装gcc-4.8.5,gcc多版本共存Ubuntu20.04.3中安装gcc-4.8.5,gcc多版本共存

zz@zz-VirtualBox:~$ gcc --version
gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

zz@zz-VirtualBox:~$ g++ --version
g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

gcc/g++版本信息
<span class="hljs-attribute">ls /usr/bin/gcc*</span>命令可以查当前系统中所有的gcc版本,只有gcc-9:
Ubuntu20.04.3中安装gcc-4.8.5,gcc多版本共存Ubuntu20.04.3中安装gcc-4.8.5,gcc多版本共存

zz@zz-VirtualBox:~$ ls /usr/bin/gcc*
/usr/bin/gcc        /usr/bin/gcc-ar-9    /usr/bin/gcc-ranlib
/usr/bin/gcc-9      /usr/bin/gcc-nm    /usr/bin/gcc-ranlib-9
/usr/bin/gcc-ar     /usr/bin/gcc-nm-9

当前系统中所有的gcc版本
Ubuntu20.04中自带的gcc版本为9.3.0;若直接安装gcc-4.8.5/gcc-4.8,会有以下报错:

zz@zz-VirtualBox:~$ sudo apt install gcc-4.8.5
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
E: 无法定位软件包 gcc-4.8.5
E: 无法按照 glob ‘gcc-4.8.5’ 找到任何软件包
zz@zz-VirtualBox:
zz@zz-VirtualBox:~$ sudo apt install gcc-4.8
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
没有可用的软件包 gcc-4.8,但是它被其它的软件包引用了。
这可能意味着这个缺失的软件包可能已被废弃,
或者只能在其他发布源中找到

此时先输入 sudo apt update 命令,即更新源列表后,再次安装还是同样的问题,说明目前本地源列表(sources.list)中并没有此包资源。

经过How to install gcc-4.8的解答,在Toolchain test builds页面中可以查到有gcc-4.8.5的版本:

Ubuntu20.04.3中安装gcc-4.8.5,gcc多版本共存

gcc-4.8.5版本在包gcc-4.8中,ubuntu8~16.04.1(Xenial Ubuntu16.04)和ubuntu8~14.04.2(Trusty Ubuntu 14.04)中有。

备注:ubuntu数字版本号对应codename:

Ubuntu20.04.3中安装gcc-4.8.5,gcc多版本共存

lsb_release -a命令输出有本机的codename:<span style="color: rgba(0, 0, 0, 1)">Codename: focal</span>

至此,在此PPA中找到了gcc-4.8.5的资源。按照下面步骤安装:

注:PPA是Personal Package Archives首字母简写。翻译为中文意思是:个人软件包文档。只有Ubuntu用户可以用,而所有的PPA都是寄存在launchpad.net网站上。

S1:加入并更新下载源

zz@zz-VirtualBox:~$ sudo vim /etc/apt/sources.list
//sources.list末尾添加deb http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu xenial main 
deb-src http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu xenial main
zz@zz-VirtualBox:~$ sudo apt update

更新后,可按如下验证:

zz@zz-VirtualBox:~$ apt-cache policy gcc-4.8
gcc-4.8:
  已安装:(无)
  候选: 4.8.5-4ubuntu8~16.04.1
  版本列表:
     4.8.5-4ubuntu8~16.04.1 500
        500 http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu xenial/main amd64 Packages
zz@zz-VirtualBox:~$ apt-cache policy g++-4.8
g++-4.8:
  已安装:(无)
  候选: 4.8.5-4ubuntu8~16.04.1
  版本列表:
     4.8.5-4ubuntu8~16.04.1 500
        500 http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu xenial/main amd64 Packages

可以看到gcc-4.8.5/g++-4.8.5均在添加的源中。

备注1:记录一下我遇到的坑:

第一次尝试安装时在sources.list中添加PPA的是 阿里云trusty镜像(deb http://mirrors.aliyun.com/ubuntu trusty main),

顺利安装完后,查gcc --version:gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2。悲剧!只能卸载重装。

提前用 apt-cache policy 命令,可以在安装前先检查资源中具体包中的软件小版本号,是否是4.8.5;如果不是的话再找ppa直到合适的。

备注2:

注意在Toolchain test builds页面中提示:Adding this PPA to your system:

You can update your system with unsupported packages from this untrusted PPA by adding ppa:ubuntu-toolchain-r/test to your system's Software Sources.

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update

这样是把当前ubuntu系统(即Focal:http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu focal InRelease)的源添加了,并非咱们需要的;所以按照上面的步骤手动添加,页面也有相应提示:

This PPA can be added to your system manually by copying the lines below and adding them to your system's software sources.

Ubuntu20.04.3中安装gcc-4.8.5,gcc多版本共存

S2:安装gcc、g++

zz@zz-VirtualBox:~$ sudo apt install gcc-4.8 g++-4.8

安装过程有坑,记录如下:

zz@zz-VirtualBox:~$ sudo apt install gcc-4.8 g++-4.8
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
有一些软件包无法被安装。如果您用的是 unstable 发行版,这也许是
因为系统无法达到您要求的状态造成的。该版本中可能会有一些您需要的软件
包尚未被创建或是它们已被从新到(Incoming)目录移出。
下列信息可能会对解决问题有所帮助:

下列软件包有未满足的依赖关系:
 g++-4.8 : 依赖: libmpfr4 (>= 3.1.3) 但无法安装它
 gcc-4.8 : 依赖: cpp-4.8 (= 4.8.5-4ubuntu8~16.04.1) 但是它将不会被安装
           依赖: libmpfr4 (>= 3.1.3) 但无法安装它
E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。

之前先用阿里云的trusty镜像安装gcc-4.8时,没有此提示,是因为其镜像中有libmpfr4包,所以连带安装了。体现在当时安装的打印:
Ubuntu20.04.3中安装gcc-4.8.5,gcc多版本共存Ubuntu20.04.3中安装gcc-4.8.5,gcc多版本共存

zz@zz-VirtualBox:~$ sudo apt install gcc-4.8 g++-4.8
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
下列软件包是自动安装的并且现在不需要了:
  libfprint-2-tod1 libllvm9
使用'sudo apt autoremove'来卸载它(它们)。
将会同时安装下列软件:
  cpp-4.8 gcc-4.8-base libasan0 libcloog-isl4 libgcc-4.8-dev libisl10 libmpfr4
  libstdc++-4.8-dev multiarch-support
建议安装:
  gcc-4.8-locales g++-4.8-multilib gcc-4.8-doc libstdc++6-4.8-dbg
  gcc-4.8-multilib libgcc1-dbg libgomp1-dbg libitm1-dbg libatomic1-dbg
  libasan0-dbg libtsan0-dbg libbacktrace1-dbg libquadmath0-dbg binutils-gold
  libstdc++-4.8-doc
下列【新】软件包将被安装:
  cpp-4.8 g++-4.8 gcc-4.8 gcc-4.8-base libasan0 libcloog-isl4 libgcc-4.8-dev
  libisl10 libmpfr4 libstdc++-4.8-dev multiarch-support
升级了 0 个软件包,新安装了 11 个软件包,要卸载 0 个软件包,有 27 个软件包未被升级。
需要下载 20.0 MB 的归档。
解压缩后会消耗 68.6 MB 的额外空间。
您希望继续执行吗? [Y/n] y
获取:1 http://mirrors.aliyun.com/ubuntu trusty/main amd64 multiarch-support amd64 2.19-0ubuntu6 [4,482 B]
获取:2 http://mirrors.aliyun.com/ubuntu trusty/main amd64 gcc-4.8-base amd64 4.8.2-19ubuntu1 [15.4 kB]
获取:3 http://mirrors.aliyun.com/ubuntu trusty/main amd64 libasan0 amd64 4.8.2-19ubuntu1 [63.0 kB]
获取:4 http://mirrors.aliyun.com/ubuntu trusty/main amd64 libisl10 amd64 0.12.2-1 [419 kB]
获取:5 http://mirrors.aliyun.com/ubuntu trusty/main amd64 libcloog-isl4 amd64 0.18.2-1 [57.5 kB]
获取:6 http://mirrors.aliyun.com/ubuntu trusty/main amd64 libmpfr4 amd64 3.1.2-1 [203 kB]
获取:7 http://mirrors.aliyun.com/ubuntu trusty/main amd64 cpp-4.8 amd64 4.8.2-19ubuntu1 [4,439 kB]
获取:8 http://mirrors.aliyun.com/ubuntu trusty/main amd64 libgcc-4.8-dev amd64 4.8.2-19ubuntu1 [1,688 kB]
获取:9 http://mirrors.aliyun.com/ubuntu trusty/main amd64 gcc-4.8 amd64 4.8.2-19ubuntu1 [5,012 kB]
获取:10 http://mirrors.aliyun.com/ubuntu trusty/main amd64 libstdc++-4.8-dev amd64 4.8.2-19ubuntu1 [1,050 kB]
获取:11 http://mirrors.aliyun.com/ubuntu trusty/main amd64 g++-4.8 amd64 4.8.2-19ubuntu1 [7,038 kB]
已下载 20.0 MB,耗时 2分 46秒 (121 kB/s)

View Code
尝试利用aptitude工具安装也未果,同样的报错(深层原因:源里没有libmpfr4的资源呀喂)。(aptitude 会对依赖关系进行智能处理;命令:sudo aptitude install gcc-4.8)。

所以手动安装libmpfr4。先在此页面下载deb包:

Ubuntu20.04.3中安装gcc-4.8.5,gcc多版本共存

查看自己的环境是amd还是arm:用 dpkg --print-architecture 命令打印Linux系统架构,下载对应的包。安装命令如下:

zz@zz-VirtualBox:~$ cd 下载
zz@zz-VirtualBox:~/下载$ sudo dpkg -i libmpfr4_3.1.5-1_amd64.deb

然后再次输入安装命令: sudo apt install gcc-4.8 g++-4.8,顺利安装

安装完先验证下:

zz@zz-VirtualBox:~$ ls /usr/bin/gcc*
/usr/bin/gcc      /usr/bin/gcc-ar-4.8  /usr/bin/gcc-nm-9
/usr/bin/gcc-4.8  /usr/bin/gcc-ar-9    /usr/bin/gcc-ranlib
/usr/bin/gcc-9    /usr/bin/gcc-nm      /usr/bin/gcc-ranlib-4.8
/usr/bin/gcc-ar   /usr/bin/gcc-nm-4.8  /usr/bin/gcc-ranlib-9

zz@zz-VirtualBox:~/下载$ ls /usr/bin/g++*
/usr/bin/g++  /usr/bin/g++-4.8  /usr/bin/g++-9

S3:更新默认gcc、g++

当前系统中安装了两个gcc版本,包分别为gcc-9(9.3.0)、gcc-4.8(4.8.5)。此时默认的gcc版本还是gcc-9.3.0,验证如下:
Ubuntu20.04.3中安装gcc-4.8.5,gcc多版本共存Ubuntu20.04.3中安装gcc-4.8.5,gcc多版本共存

zz@zz-VirtualBox:~/下载$ gcc --version
gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

zz@zz-VirtualBox:~/下载$ ls -lh /usr/bin/gcc
lrwxrwxrwx 1 root root 21 9月  24 09:17 /usr/bin/gcc -> /etc/alternatives/gcc
zz@zz-VirtualBox:~/下载$ ls -lh /etc/alternatives/gcc
lrwxrwxrwx 1 root root 14 9月  24 09:21 /etc/alternatives/gcc -> /usr/bin/gcc-9
zz@zz-VirtualBox:~/下载$ ls -lh /usr/bin/gcc-9
lrwxrwxrwx 1 root root 22 8月   8  2020 /usr/bin/gcc-9 -> x86_64-linux-gnu-gcc-9

View Code
可以看到gcc是软链接到gcc-9。因此需要将系统的gcc指向gcc-4.8,输入下面的命令设置默认版本:

zz@zz-VirtualBox:~/下载$ sudo update-alternatives  --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 2
zz@zz-VirtualBox:~/下载$ sudo update-alternatives  --install /usr/bin/gcc gcc /usr/bin/gcc-9 1
update-alternatives: 使用 /usr/bin/gcc-4.8 来在自动模式中提供 /usr/bin/gcc (gcc)

说明:先后添加gcc-4.8 gcc-9到gcc,使得ubuntu下gcc多版本共存;每行后面的数字(2、1)表示优先级,越大越高。即gcc-4.8优先级高于gcc-9。

使用以下命令查看设置结果:

zz@zz-VirtualBox:~/下载$ sudo update-alternatives  --config gcc
有 2 个候选项可用于替换 gcc (提供 /usr/bin/gcc)。

  选择       路径            优先级  状态
------------------------------------------------------------
* 0            /usr/bin/gcc-4.8   2         自动模式
  1            /usr/bin/gcc-4.8   2         手动模式
  2            /usr/bin/gcc-9     1         手动模式

要维持当前值[*]请按<回车键>,或者键入选择的编号:

同样也要设置一下g++的:

zz@zz-VirtualBox:~/下载$ sudo update-alternatives  --install /usr/bin/g++ g++ /usr/bin/g++-9 1
update-alternatives: 使用 /usr/bin/g++-9 来在自动模式中提供 /usr/bin/g++ (g++)
zz@zz-VirtualBox:~/下载$ sudo update-alternatives  --install /usr/bin/g++ g++ /usr/bin/g++-4.8 2
update-alternatives: 使用 /usr/bin/g++-4.8 来在自动模式中提供 /usr/bin/g++ (g++)
zz@zz-VirtualBox:~/下载$ sudo update-alternatives  --config g++
有 2 个候选项可用于替换 g++ (提供 /usr/bin/g++)。

  选择       路径            优先级  状态
------------------------------------------------------------
* 0            /usr/bin/g++-4.8   2         自动模式
  1            /usr/bin/g++-4.8   2         手动模式
  2            /usr/bin/g++-9     1         手动模式

要维持当前值[*]请按<回车键>,或者键入选择的编号:

对比未使用 sudo update-alternatives --install 命令前:
Ubuntu20.04.3中安装gcc-4.8.5,gcc多版本共存Ubuntu20.04.3中安装gcc-4.8.5,gcc多版本共存

zz@zz-VirtualBox:~/下载$ sudo update-alternatives  --config gcc
链接组 gcc (提供 /usr/bin/gcc)中只有一个候选项:/usr/bin/gcc-9
无需配置。

zz@zz-VirtualBox:~/下载$ sudo update-alternatives  --config g++
update-alternatives: 错误: 无 g++ 的候选项

View Code

S4:验证结果

zz@zz-VirtualBox:~/下载$ gcc --version
gcc (Ubuntu 4.8.5-4ubuntu8~16.04.1) 4.8.5
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

zz@zz-VirtualBox:~/下载$ g++ --version
g++ (Ubuntu 4.8.5-4ubuntu8~16.04.1) 4.8.5
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

此时cmake会找到gcc-4.8.5来作为其默认的编译器:

zz@zz-VirtualBox:~/GitLab/weblmt/src/build$ cmake ..
-- The C compiler identification is GNU 4.8.5
-- The CXX compiler identification is GNU 4.8.5
……

对比之前的:

zz@zz-VirtualBox:~/GitLab/weblmt/src/build$ cmake ..
-- The C compiler identification is GNU 9.3.0
-- The CXX compiler identification is GNU 9.3.0

参考:

Ubuntu 19.10 降级安装gcc4.8、g++4.8

其它宏Ubuntu下gcc多版本共存和版本切换

How to install gcc-4.8

ubuntu安装gcc5.4版本,亲测有效!

更改gcc默认版本(gcc版本降级/升级)与update-alternatives的使用

"PPA for Ubuntu Toolchain Uploads (restricted)” team

https://launchpad.net/ubuntu/+archivemirrors

https://launchpad.net/ubuntu/+mirror/mirrors.aliyun.com-archive





原文链接: https://www.cnblogs.com/zzoo/p/ubuntu20_04_3-gcc_4_8_5.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/213980

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 上午2:00
下一篇 2023年2月13日 上午2:01

相关推荐