gcc/g++多版本切換 (ubuntu18.04)


使用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,它的狀態就從自動變成了手動,這樣安裝腳本就不會更新它了。

 


免責聲明!

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



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