背景:
公司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.
用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
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)
嘗試利用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
可以看到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++ 的候選項
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
更改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