Ubuntu 安裝 gcc/g++,gcc/g++ 多版本切換

本篇介紹 Ubuntu 安裝 gcc/g++ 以及 gcc/g++ 多版本切換方式,

使用 apt-get 安装最新版本的 gcc

使用 apt-get 安装最新版本的 gcc 與 g++ 指令如下,安裝前記得先 apt-get update 一下,

1
2
sudo apt-get update
sudo apt-get install gcc g++

使用 apt-get 安装指定的 gcc/g++ 版本

以我 ubuntu 16.04 為例,可以安裝的版本如下,

1
2
3
4
sudo apt-get install gcc-4.7 g++-4.7
sudo apt-get install gcc-4.8 g++-4.7
sudo apt-get install gcc-4.9 g++-4.7
sudo apt-get install gcc-5 g++-5

那怎麼看可以安裝哪幾種版本呢?
apt-cache showpkg gcc 列出來的資訊不太準,我用 apt-cache search gcc 列出來以後自己慢慢看比較準,不過需要一些經驗,用 apt-cache showpkg gcc | grep ^gcc- 列出 gcc- 開頭,或者 apt-cache showpkg gcc | grep ^gcc-[0-9] 列出 gcc-0 開頭 ~ gcc-9 開頭的選項,這樣看會比較輕鬆。

切換不同版本的 gcc/g++

假如你系統已經裝了兩個版本或以上的 gcc,例如已經裝了 gcc-4.7 與 gcc-5,你可以直接使用 g++-4.7g++-5 來編譯 C++ 程式,或者你可以透過下列方式來選擇預設 gcc/g++ 要使用哪個版本,假設我要把 gcc-5 作為我的預設 gcc,就輸入這樣的指令,把 gcc-4.7 優先權設定為 47,gcc-5 優先權設為 50 (越高越優先),

1
2
3
4
# gcc-4.7 g++-4.7
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 47 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7
# gcc-5 g++-5
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 50 --slave /usr/bin/g++ g++ /usr/bin/g++-5

這邊我是一起設定 gcc 與 g++ 一起作動,你可以單獨分開設定,後面不要加 --slave 就可,

這時候你可以用 gcc --versiong++ --version 指令來檢查確認一下當前 gcc 使用的版本,

1
2
3
4
5
6
7
8
9
10
11
$ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
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.

$ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
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.

輸入 sudo update-alternatives --config gcc 來選擇使用哪一種版本

1
2
3
4
5
6
7
8
9
10
$ sudo update-alternatives --config gcc
There are 2 choices for the alternative gcc (providing /usr/bin/gcc).

Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/bin/gcc-5 50 auto mode
1 /usr/bin/gcc-4.7 47 manual mode
2 /usr/bin/gcc-5 50 manual mode

Press <enter> to keep the current choice[*], or type selection number:

然後在 selection number: 輸入 1 按 enter 的話,會手動切換成 gcc-4.7 與 g++-4.7(原本為 0 自動模式是按優先權決定)之後再用 gcc --version 去確認一下當前 gcc 使用的版本應該就切換成 gcc-4.7 了,

1
2
3
4
5
$ gcc --version
gcc (Ubuntu/Linaro 4.7.4-3ubuntu12) 4.7.4
Copyright (C) 2012 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 update-alternatives 連動更多相關程式的版本

稍早有介紹將 gcc 與 g++ 的版本使用 update-alternatives 一起連動,但通常還有更多的 gcc 相關工具也要一起連動,例如:gcc-ar、gcc-nm 等等,以下提供一個方便的腳本來連動這些事情,有些執行檔舊版本不一定有,可以註解掉,挑選你想要連動的相關程式就好,

update-alternatives-gcc.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/env bash

function update-alternatives-gcc() {
local version=$1
local priority=$2

update-alternatives \
--install /usr/bin/gcc gcc /usr/bin/gcc-${version} ${priority} \
--slave /usr/bin/g++ g++ /usr/bin/g++-${version} \
--slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-${version} \
--slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-${version} \
--slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-${version} \
--slave /usr/bin/gcov gcov /usr/bin/gcov-${version} \
--slave /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-${version} \
--slave /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-${version} \
--slave /usr/bin/x86_64-linux-gnu-gcc x86_64-linux-gnu-gcc /usr/bin/x86_64-linux-gnu-gcc-${version} \
--slave /usr/bin/x86_64-linux-gnu-g++ x86_64-linux-gnu-g++ /usr/bin/x86_64-linux-gnu-g++-${version} \
--slave /usr/bin/x86_64-linux-gnu-gcc-ar x86_64-linux-gnu-gcc-ar /usr/bin/x86_64-linux-gnu-gcc-ar-${version} \
--slave /usr/bin/x86_64-linux-gnu-gcc-nm x86_64-linux-gnu-gcc-nm /usr/bin/x86_64-linux-gnu-gcc-nm-${version} \
--slave /usr/bin/x86_64-linux-gnu-gcc-ranlib x86_64-linux-gnu-gcc-ranlib /usr/bin/x86_64-linux-gnu-gcc-ranlib-${version} \
--slave /usr/bin/x86_64-linux-gnu-gcov x86_64-linux-gnu-gcov /usr/bin/x86_64-linux-gnu-gcov-${version} \
--slave /usr/bin/x86_64-linux-gnu-gcov-dump x86_64-linux-gnu-gcov-dump /usr/bin/x86_64-linux-gnu-gcov-dump-${version} \
--slave /usr/bin/x86_64-linux-gnu-gcov-tool x86_64-linux-gnu-gcov-tool /usr/bin/x86_64-linux-gnu-gcov-tool-${version}
}

update-alternatives-gcc $1 $2

例如我要將 gcc-4.7、g++-4.7、gcc-ar-4.7、gcc-nm-4.7 … 加入 update-alternatives --config gcc 的選項裡的話,執行 update-alternatives-gcc.sh 腳本後面接上版本優先權這樣就可以了!

1
sudo update-alternatives-gcc.sh 4.7 47

如果是要將 gcc-5、g++-5 … 加入 update-alternatives --config clang 的選項裡的話,就這樣下,

1
sudo update-alternatives-gcc.sh 5 50

其他參考
update-alternatives · GitHub
https://gist.github.com/lopesivan/6f638631552ed7090e2236cd83358028

其它相關文章推薦
Ubuntu 安裝 clang,clang 多版本切換