使用Ubuntu18.04已經有一段時間了,在使用過程中經常需要處理不同軟件的編譯工作,但是這時候就遇到這樣一個問題,那就是不同軟件,甚至是同一個軟件的不同版本都會使用不同版本的gcc/g++來進行編譯。
Ubuntu18.04中自帶的gcc/g++ 版本為7.3, 這時候如果我們想要安裝4.8版本的,那么命令如下:
sudo apt-get install gcc-4.8 sudo apt-get install g++-4.8
安裝成功后查看gcc/g++調用版本是否正確:
由上圖可以發現即使是安裝好gcc/g++ 4.8版本后我們的系統識別的版本還是7.3 。
查看gcc/g++ 具體地址:
查看路徑下是否存在多版本的gcc/g++ :
ls /usr/bin/gcc*
ls /usr/bin/g++*
我們可以發現其實系統里面已經有三個版本的gcc/g++, 分別是4.8, 5, 7 。
查看細節:
可以發現,
gcc方面:
/usr/bin/gcc 是鏈接到 /etc/alternatives/gcc上的,而
/usr/bin/gcc-7 是鏈接到 /usr/bin 目錄下的 x86_64-linux-gnu-gcc-7 ,
/usr/bin/gcc-4.8 和 /usr/bin/gcc-5 是沒有鏈接到任何文件的。
g++方面:
/usr/bin/g++ 鏈接到 /etc/alternatives/g++ 上的,
/usr/bin/g++-7 鏈接到 /usr/bin/ 目錄下 x86_64-linux-gnu-g++-7 文件的,
/usr/bin/g++-4.8 和 /usr/bin/g++-5 是沒有鏈接到任何文件的。
接着下一步,我們查看 /usr/alternatives/gcc 和 /usr/alternatives/g++ 的詳細情況:
可以發現 /usr/alternatives/gcc 和 /usr/alternatives/g++ 最終鏈接又回到了 /usr/bin/ 文件目錄下的 gcc-7 和 g++-7 。
由此我們可以大膽猜測, 可執行文件 /usr/bin/gcc 和 /usr/bin/g++ 其實就是一個軟鏈接,真正的可執行文件其實是:
/usr/bin/gcc-4.8 所指向的 /usr/bin/x86_64-linux-gnu-gcc-4.8jiu 就是可執行文件,
/usr/bin/gcc-5 所指向的 /usr/bin/x86_64-linux-gnu-gcc-5 就是可執行文件,
/usr/bin/gcc-7 所指向的 /usr/bin/x86_64-linux-gnu-gcc-7
和
/usr/bin/g++-4.8 所指向的 /usr/bin/x86_64-linux-gnu-g++-4.8 就是可執行文件,
/usr/bin/g++-5 所指向的 /usr/bin/x86_64-linux-gnu-g++-5 就是可執行文件,
/usr/bin/g++-7 所指向的 /usr/bin/x86_64-linux-gnu-g++-7
作為中轉的軟鏈接,/usr/alternatives/gcc 和 /usr/alternatives/g++ 是我們在做gcc/g++版本選擇時所需要切換的文件,同時指定版本的
/usr/bin/gcc-* 和 /usr/bin/g++-* 會指向同目錄下的可指向文件。
而,
/usr/bin/gcc -> /etc/alternatives/gcc
/usr/bin/g++ -> /etc/alternatives/g++ 是固定不變的。
=============================================================
前面內容為一些探索過程,下面給出具體步驟:
由下圖可知系統里面一共安裝了三個版本的gcc/g++, 分別為4.8, 5, 7 。
update-alternatives
是ubuntu系統中專門維護系統命令鏈接符的工具,通過它可以很方便的設置系統默認使用哪個命令、哪個軟件版本。
執行命令:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 50 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 50
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 50 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 50
可以發現,該命令形式為 update-alternatives --install + (多版本命令在系統中的進入地址) + (在update-alternatives中的注冊名稱)+ (實際可執行命令的物理地址) + (自動模式下的優先級數字)
多版本命令在系統中的進入地址:
在gcc 中,該部分為 /usr/bin/gcc 在g++中該部分為 /usr/bin/g++ ,
該部分就是我們在系統中執行gcc/g++命令時在搜索路徑中的搜索到命令的地址。我們在系統終端執行gcc/g++時調用的就是 /usr/bin/gcc 和 /usr/bin/g++ 。
在update-alternatives中的注冊名稱:
我們在 update-alternatives 軟件中注冊的服務名, 我們在update-alternatives 中管理的服務名就是這個注冊的服務名。
這里分別是 gcc 和 g++ 。以后管理時以它為關聯依據。
實際可執行命令的物理地址:
這里是各個版本的gcc/g++中磁盤中的實際物理地址,即各個版本的可執行文件的地址。
這里是; /usr/bin/gcc-4.8 , /usr/bin/gcc-5 , /usr/bin/gcc-7
/usr/bin/g++-4.8 , /usr/bin/g++-5 , /usr/bin/g++-7 。
自動模式下的優先級數字:
指的是 設置的服務名 的服務在自動模式下的優先級。
優先級,數字越大優先級越高。
========================================
查看已注冊列表
update-alternatives --display gcc
update-alternatives --display 服務名
由上圖,可以發現模式為 自動模式。
交互式修改
交互式修改會提供該服務名下所有可用的版本, 選擇對應的索引確認。
sudo update-alternatives --config gcc
sudo update-alternatives --config 服務名
可以發現交互式修改后 該服務模式變為手動模式。
手動將服務改為自動模式:
sudo update-alternatives --auto gcc
添加候選項:
sudo update-alternatives --set gcc /usr/bin/gcc-4.8
update-alternatives --set +服務名+ 可執行命令的物理路徑
--set 命令可以非交互式的改變 服務 gcc 的執行,而不用使用 --config 進行交互式的手動改變服務的指向。
可以看到該命令 非交互式的改變了 gcc 服務的 指向, 執行該命令之前gcc指向gcc-7, 執行之后指向gcc-4.8 。
查看注冊到某服務名下的各個可執行文件路徑:
sudo update-alternatives --list gcc
可以看到 服務 gcc 之下一個有三個可執行文件注冊。
刪除某服務:
update-alternatives --remove-all
gcc
刪除某服務中的某候選項:
update-alternatives --remove
gcc /usr/bin/gcc-4.8
服務中 某可執行文件路徑的優先級數字越大,優先級越高:
==================================================================
注:
下面內容來自:
http://www.linuxeye.com/Linux/alternatives.html
update-alternatives在一般情況下是由postinst和prerm這樣的安裝腳本自 動調用的,所以一個alternative的狀態有兩種:自動和手動。每個alternative的初始狀態都是自動,如果系統發現管理員手動修改了一個 alternative,它的狀態就從自動變成了手動,這樣安裝腳本就不會更新它了。