1. 程式人生 > >編譯GCC及其多版本並存控制

編譯GCC及其多版本並存控制

由導學寶轉自:http://hi.baidu.com/ruikflyer/blog/item/d43a8ec341c88d5eb219a875.html
無論是作為一名Linux Geek,或是面向Linux的軟體工程師,還是嵌入式Linux開發人員,我們都離不開GCC,GCC在Linux中的重要性,從gcc-${version}-base軟體包便知道其有多霸道了。而對開發人員來說,編譯程式自然更離不開GCC了,並且對於有的軟體包,有可能只針對特定版本的GCC,或許是一個版本很老的GCC(因為隨著GCC的成長,它更加成熟,更加標準化,以前開發的軟體包,可能會依賴當時的GCC版本,雖然能通過當時的GCC編譯,然而卻不能通過當前較新版本的編譯檢察),於是,我們不得不使用不同版本的GCC編譯器。





說了這麼多,只為說明一個問題:我們可能會經常使用不同版本的GCC,而且我們可能要通過GCC原始碼,手動編譯安裝,其主要原因有如下兩點:

1.針對不同分發版的Linux,不一定能馬上找到其支援的二進位制安裝包,然而原始碼包卻很容易在gnu.org上得到。

2.現有編譯好的二進位制包配置不符合我們要求,我們需要重新編譯,配置編譯引數,定製我們想要的GCC。



有了多個版本的GCC編譯器,我們又如何方便快捷地管理它們呢?如果管理得不好,GCC的toolchain錯亂,多個版本之間相互呼叫中間處理程式(如cpp, compile pre-processing等),有可能因此編譯一個程式老半天,看著make的一大堆莫名其妙的錯誤輸出,足以讓我們鬱悶半天。




所以,編譯安裝GCC重要,管理好不同版本GCC共存更重要。



我現在便以編譯最近的gcc-4.4.0為例,講解編譯gcc的一般流程,及管理不同版本gcc共存的方法。



Step 1:

下載原始碼包,比如我下的gcc-4.4.0.tar.bz2.

然後解壓:

$ tar xjvf ./gcc-4.4.0.tar.bz2



Step 2:

建立一個編譯工作目錄,有的建議在原始碼的同級下建一個目錄,也有的建議直接在原始碼目錄下新建編譯工作目錄,我選擇的後者,先進入原始碼目錄:

$ cd gcc-4.4.0

$ mkdir ./build

$ cd ./build



Step 3:

這就進入了常規的configure過程:(此過程成功與否,往往和你當前機器中安裝的軟體包有關,如果檢查依賴關係錯誤,提示少什麼依賴,那就找到相應版本要求的軟體包,安裝即可)


$ ../configure --prefix=/usr/gcc-4.4.0 --enable-languages=all --with-gmp=/usr/local/gmp --with-mpfr=/usr/local/mpfr --enable-libgomp



Step 4:

此步是滿足Step 3中的依賴關係。若Step 3順利,configure成功執行並生成Makefile,此步驟便可略過。由於我編譯過程中缺少gmp和mpfr依賴,於是我便作了如下操作:

一、安裝gmp(傳統過程) 

下載到gmp軟體包,然後執行:

$ tar xjvf ./ gmp-4.3.0.tar.bz2

$ cd ./ gmp-4.3.0

$ ./configure --prefix=/usr/local/gmp

$ make

$ make check

# make install

$ make distclean



二、安裝mpfr(依然是傳統過程)

依然下載到mpfr軟體包,然後執行:

$ tar xjvf ./mpfr-2.4.1.tar.bz2

$ cd ./ mpfr-2.4.1

$ ./configure --prefix=/usr/local/mpfr --with-gmp=/usr/local/gmp

$ make

$ make check

# make install

$ make distclean



三、重新執行剛才沒有成功的Step 3:

$ export LD_RUN_PATH=/usr/local/lib:/usr/local/mpfr/lib:/usr/local/gmp/lib
$ export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/mpfr/lib:/usr/local/gmp/lib
$ LD_RUN_PATH=/usr/local/lib:/usr/local/mpfr/lib:/usr/local/gmp/lib LD_LIBRARY_PATH=/usr/local/lib:/usr/local/mpfr/lib:/usr/local/gmp/lib
$ ../configure --prefix=/usr/gcc-4.4.0 --enable-languages=all --with-gmp=/usr/local/gmp --with-mpfr=/usr/local/mpfr --enable-libgomp

(若不想以後每次編譯時都寫這麼一大堆,可以參考我前一篇日誌《Linux啟動過程中幾個重要配置檔案的執行過程》將這些環境變數寫在配置檔案中)

成功執行後,生成Makefile。



Step 5:

前面做了很多工作,現在可以輕鬆一下,此步一個命令就搞掂。

$ make



Step 6:

如果Step 5中的make成功,那麼就略過,否則就要根據make錯誤提示,找出問題,解決後重新編譯。



Step 7:

編譯完成後,我們只用安裝了:

#make install



Step 8:

清理工作:

$rm -rf *





這就是我編譯gcc-4.4.0的全過程,途中遇到好幾個問題,但解決的過程太雜,反正都是一陣google,步驟都體現在了Step 4及Step 6中,為了使整個過程清晰,我便沒有寫出來了,因為過於specific無用。總之,遇到問題不用急,充分利用google和各大Linux論壇,問題總會解決的。下面給一個連結,是我當時編譯時,兩個問題的答案都從此文得到:

Unix Linux Forums:http://fixunix.com/solaris/490396-gcc-build-fails-cannot-compute-suffix-object-files.html 





編譯好了之後,那麼我們系統中至少將會有兩個版本的GCC:一個是我們現在編譯好的,還有一個是剛才用到的以前版本的GCC,那麼我們如何方便地從這幾個版本進行切換呢?



一種粗劣的方法是手動用ln -s建立symbolic來管理,但這樣費時費力,而且容易導致toolchain混亂。



幸好有update-alternatives實用軟體!它可以方便管理好同一軟體的各個不同版本。



1.一般情況下,編譯程式路徑都是使用
/usr/bin/gcc
其實這個/usr/bin/gcc只是個符號連結,它指向了/etc/alternatives/gcc,而/etc/alternatives/gcc是指向了/usr/bin/gcc-4.3,可以用ls命令檢視
[email protected]:~$ ls -l /usr/bin/gcc
lrwxrwxrwx 1 root root 21 2009-04-28 13:35 /usr/bin/gcc -> /etc/alternatives/gcc
[email protected]:~$ ls -l /etc/alternatives/gcc
lrwxrwxrwx 1 root root 16 2009-04-28 13:40 /etc/alternatives/gcc -> /usr/bin/gcc-4.3



2.現在我們使用update-alternatives管理我們的GCC版本:

[email protected]:~$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/gcc-4.4.0/bin/gcc 50

[email protected]:~$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.3 40
[email protected]:~$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.1 30

這樣,我們就已經把我們安裝的三個GCC版本向update-alternatives註冊了,接下來我們便可以方便地管理各版本切換。



3.切換版本
切換版本到gcc-4.4.0:

[email protected]:~$ sudo update-alternatives --config gcc
[sudo] password for z:

現有 3 個可選項,它們都提供了“gcc”<

選擇 可選項
-----------------------------------------------
*+ 1 /usr/gcc-4.4.0/bin/gcc
2 /usr/bin/gcc-4.3
3 /usr/bin/gcc-4.1

要維持預設值[*],按回車鍵,或者鍵入選擇的編號:



輸入想要切換的版本,回車之後就OK了,然後你可以用gcc --version檢視版本。



(注:操作過程中,有"#"提示符的部分,需要提升許可權,一般使用根使用者或者sudo即可。編譯gcc-4.4.0需要至少2G臨時空間。此文中若有錯誤或缺陷,望指出。)



畢。

相關推薦

編譯GCC及其版本並存控制

由導學寶轉自:http://hi.baidu.com/ruikflyer/blog/item/d43a8ec341c88d5eb219a875.html無論是作為一名Linux Geek,或是面向Linux的軟體工程師,還是嵌入式Linux開發人員,我們都離不開GCC,GC

火狐版本並存

release post com 分享圖片 圖片 firefox pub 漢化 插件     http://www.360doc.com/content/11/0327/00/59741_104889248.shtml 火狐 =拓展 歷史版本 web delove 漢

python版本並存

python3 ipy -a ofo name 描述 sim imp sta 6.0 使用pip安裝科學棧如numpy、pandas等 6.1 為Python2.7版本安裝科學棧 查看已安裝科學棧情況和版本 python2 -m pip list 查看 python2 -m

關於mysql可重複讀的原因和幻讀的解決(MVCC-版本併發控制

第三個隔離級別RR可以解決不可重複度的問題,那什麼是可重複讀: Repeatable Read(可重複讀):一個事務在執行過程中可以看到其他事務已經提交的新插入的記錄(讀已經提交的,其實是讀早於本事務開始且已經提交的),但是不能看到其他事務對已有記錄的更新(即晚於本事務開始的),並且,該事務

輕鬆 無錯 不傷系統的配置深度學習框架 tensorflow cuda cudnn tensorflow caffe 版本任意切換 版本並存

前置安裝:nvidia 顯示卡驅動 下一步安裝anaconda,如果安裝anaconda3就會自動去連結python3 配套的庫。 首先理解下配置環境是在幹嘛:很簡單,就是安裝軟體 那麼怎麼簡化這個過程,避免換個環境,就得解除安裝重灌,和別人共用一個伺服器,就為了配置環境焦頭爛額。

MySQL版本併發控制機制(MVCC)-原始碼淺析

前言 作為一個數據庫愛好者,自己動手寫過簡單的SQL解析器以及儲存引擎,但感覺還是不夠過癮。<<事務處理-概念與技術>>誠然講的非常透徹,但只能提綱挈領,不能讓你玩轉某個真正的資料庫。感謝cmake,能夠讓我在mac上用xcode去debug MySQL,從而能去領略它的

版本併發控制(MVCC)

MVCC是行級鎖的一個變種,在很多情況下避免了加鎖操作,開銷很低,雖然實現機制不同,大多實現了非阻塞的讀操作,寫操作也只鎖定必要的行 InnoDB的MVCC,是通過在每行記錄後面儲存兩個隱藏的列來實現的。這兩個列,一個是行的建立時間,一個是行的過期時間或刪除時

Ubuntu下gcc/g++版本共存和版本切換

Ubuntu系統使用的gcc版本隨著釋出版本的不同而不同,在編譯android系統時不同的版本推薦用不同的gcc去編譯,那麼可不可以改變系統的gcc來適應android編譯環境的需求呢?答案是可以的。  先看看我們系統用的gcc和g++是什麼版本  gcc -v 可以獲得

MySQL MVCC(版本併發控制)

概述   為了提高併發MySQL加入了多版本併發控制,它把舊版本記錄儲存在了共享表空間(undolog),當事務提交之後將重做日誌寫入磁碟(前提innodb_flush_log_at_trx_commit為1)清空undolog,在5.6版本之後unodlog可以獨立出共享表空間,引入MVCC的目的就是減少

高效能MySQL -MySQL架構,MVCC版本併發控制和一些基本概念

內容源於《高效能MySQL》 一、MySQL邏輯架構 架構圖: 最上層不是Mysql獨有的, 比如連線處理,授權認證, 安全 等等 第二層核心服務功能,包括查詢解析,分析,優化,快取以及所有內建函式,儲存過程,觸發器,檢視等都在這層實現 第三層

GCC G++ 版本安裝和切換

sudo update-alternatives --config [email protected]:~$ gcc --versiongcc (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609Copyright (C) 2015 Free Software

innodb併發控制mvcc(版本併發控制

   innodb有四種事務隔離機制,read uncommitted、read committed、repeatted read、 serializable,隔離界別依次提高,而且基本靠鎖實現這些隔離級別,但眾所周知,鎖的消耗是很大的。當然,我們也都知道,mysql實現了

從一次“併發修改欄位業務”引出版本併發控制與InnoDB鎖

併發欄位修改業務 最近在主要在做“工作流引擎”課題的預研工作,在涉及到“會籤任務”(工作流業務概念,這與我們今天討論文問題沒有太多關聯)的時候,遇到了一個併發修改同一個欄位的應用場景。 大致是由於要等一個活動節點的所有例項任務都完成之後才能繼續向下流轉,則引擎必須在每次任務提交的時候進行判斷。我選擇了在資料庫

MySQL的事務機制和鎖(InnoDB引擎、MVCC版本併發控制技術)

# 一、事務(資料庫的事務都通用的定義) ## 1.1 事務定義 事務是由一步或幾步資料庫操作序列組成邏輯執行單元,這系列操作要麼全部執行,要麼全部放棄執行。事務通常以 `BEGIN TRANSACTION` 開始,以`COMMIT` 或 `ROLLBACK` 操作結束: * `COMMIT

MySQL版本併發控制——MVCC機制分析

MVCC,即多版本併發控制(Multi-Version Concurrency Control)指的是,通過版本鏈維護一個數據的多個版本,使得讀寫操作沒有衝突,可保證不同事務讀寫、寫讀操作併發執行,提高系統性能。 實際上,innodb中“**讀已提交**”和“**可重複讀**”這兩種隔離級別的事務在查詢資料

Postgres版本控制

hot tubple mvcc pg多版本控制 高並發控制肯定是數據必須達到的一個標準, 在並發操作中,對於同一個數據,同時讀和寫的兩個回話有可能產生不一致,所以出現了在高並發情況下如何保持性能又保持一致出現了MVCC,多版本並發實現MVCC的方法有兩種:1)寫數據時,將舊數據移到一個單獨的地

GCC實現文件編譯,靜態庫,動態庫

blank () iba exp main.c run spa 文件夾 con 一 代碼 //add.h int add(int a, int b); //add.c int add(int a, int b) { r

Shader預處理宏、內置狀態變量、版本編譯

format port useful sin ade title 空間 program 好的 預定義shader預處理宏:  Target platform:   SHADER_API_OPENGL - desktop OpenGL   SHADER_API_D

pyenv搭建Python版本並存的環境

versions 前言 ash dba clone eval bzip2 使用 exec 1.前言 有時多個python版本還是希望用pyenv隔離下,避免不同版本庫間的影響幹擾。 使用pyenv能很好解決python2與python3的開發使用的問題。 2.pynev

MySQL版本並發控制(MVCC)

存在 避免 因此 post 一行 postgre 創建時間 並發控制 數據 MVCC是行級鎖的一個變種,但是它在很多的情況下避免了加鎖操作,因此開銷更低。MySQL,包括Oracle、PostgreSQL都實現了MVCC,雖然每個關系數據庫實現不一樣,但大都是實現了非阻塞的