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:

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++版本信息

ls /usr/bin/gcc*命令可以查當前系統中所有的gcc版本,只有gcc-9:

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的版本:

 

 

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

備注:ubuntu數字版本號對應codename:

 

 

 lsb_release -a命令輸出有本機的codename:Codename: focal

 

至此,在此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.

 

 

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包,所以連帶安裝了。體現在當時安裝的打印:

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包:

 

 查看自己的環境是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,驗證如下:

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 命令前:

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

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM