2011年6月16日 星期四

GCC多版本共存

由于编译linux内核2.6.30时,提示gcc版本过高,网上有资料说需要使用至少gcc-4.1.2,而我使用的是fedora 5的gcc版本是gcc-4.1.0,所以想到使两个gcc版本共存,从网上找到解决方法,网址:http://hi.baidu.com/dos2004/blog/item/8aa64f455eca1023cffca3a8.html


原文如下:
fedora core8原装GCC 4.1.2,编译很多程序都报错(像MICROWIN0.90),需要GCC 3.X
下面介绍一下GCC编译,以及GCC多版本共存。
GCC编译:
1。先下载GCC原码包,gcc-3.4.2-tar.gz,
2。tar -xzvf gcc-3.4.2-tar.gz
3。建立一个目标文件夹以供编译过程用 mkdir gcc-obj(这个目录和GCC-3.4.2在同一级).再建一个程序目录,例如mkdir /usr/local/gcc-3.4.2
4。cd gcc-obj
../gcc-3.4.2/configure --prefix=/usr/local/gcc-3.4.2 --enable-threads=posix --disable-checking --enable--long-long --host=i386-redhat-linux --with-system-zlib --enable-languages=c,c++,java
5。成功以后
make 这个时间比较长,耐心等待.
6。make install 安装成功,这期间需要ROOT权限的.

GCC多版本共存:
vi /etc/profile
在环境变量的最前面加上这么一句:
export PATH=/usr/local/gcc-3.4.2/bin:$PATH
保存退出。再更新一下环境变量:
source /etc/profile
gcc --version GCC版本是不是改变了。。。
如果想要变回原来的版本,只需要把环境变量加的那句注释掉.
#export PATH=/usr/local/gcc-3.4.2/bin:$PATH
自此,GCC又变回了原来的版本.

另外再轉載一篇"如何安裝GCC編譯器"  轉載自:http://ccd9527.blogspot.com/2009/02/gcc.html
目前,GCC可以用來編譯C/C++、FORTRAN、JAVA、OBJC、ADA等語言的程序,可根據需要選擇安裝支持的語言。本文以在Redhat Linux上安裝GCC4.1.2為例(因在項目開發過程中要求使用,沒有用最新的GCC版本),介紹GCC的安裝過程。


安裝之前,系統中必須要有cc或者gcc等編譯器,並且是可用的,或者用環境變量CC指定系統上的編譯器。如果系統上沒有編譯器,不能安裝源 代碼形式的GCC 4.1.2。如果是這種情況,可以在網上找一個與你系統相適應的如RPM等二進制形式的GCC軟件包來安裝使用。本文介紹的是以源代碼形式提供的GCC軟 件包的安裝過程,軟件包本身和其安裝過程同樣適用於其它Linux和Unix系統。

系統上原來的GCC編譯器可能是把gcc等命令文件、庫文件、頭文件等分別存放到系統中的不同目錄下的。與此不同,現在GCC建議我們將一個版 本的GCC安裝在一個單獨的目錄下。這樣做的好處是將來不需要它的時候可以方便地刪除整個目錄即可(因為GCC沒有uninstall功能);缺點是在安 裝完成後要做一些設置工作才能使編譯器工作正常。在本文中採用這個方案安裝GCC 4.1.2,並且在安裝完成後,仍然能夠使用原來低版本的GCC編譯器,即一個系統上可以同時存在並使用多個版本的GCC編譯器。

按照本文提供的步驟和設置選項,即使以前沒有安裝過GCC,也可以在系統上安裝上一個可工作的新版本的GCC編譯器。

1. 下載
在GCC網站上(http://gcc.gnu.org)或者通過網上搜索可以查找到下載資源。目前GCC的最新版本為 4.2.1。可供下載的文件一般有兩種形式:gcc-4.1.2.tar.gz和gcc-4.1.2.tar.bz2,只是壓縮格式不一樣,內容完全一致,下載其中一種即可。


2. 解壓縮
拷貝gcc-4.1.2.tar.bz2(我下載的壓縮文件)到/usr/local/src(根據自己喜好選擇)下,根據壓縮格式,選擇下面相應的一種方式解包(以下的「%」表示命令行提示符):


% tar zxvf gcc-4.1.2.tar.gz
或者
% bzcat gcc-4.1.2.tar.bz2 | tar xvf -

新生成的gcc-4.1.2這個目錄被稱為源目錄,用${srcdir}表示它。以後在出現${srcdir}的地方,應該用真實的路徑來替換它。用pwd命令可以查看當前路徑。

在${srcdir}/INSTALL目錄下有詳細的GCC安裝說明,可用瀏覽器打開index.html閱讀。

3. 建立目標目錄
目標目錄(用${objdir}表示)是用來存放編譯結果的地方。GCC建議編譯後的文件不要放在源目錄${srcdir]中(雖然這樣做也可以),最好單獨存放在另外一個目錄中,而且不能是${srcdir}的子目錄。

例如,可以這樣建立一個叫 /usr/local/gcc-4.1.2的目標目錄:
  % mkdir /usr/local/gcc-4.1.2
  % cd gcc-4.1.2

以下的操作主要是在目標目錄 ${objdir} 下進行。
4. 配置
配置的目的是決定將GCC編譯器安裝到什麼地方(${destdir}),支持什麼語言以及指定其它一些選項等。其中,${destdir}不能與${objdir}或${srcdir}目錄相同。


配置是通過執行${srcdir}下的configure來完成的。其命令格式為(記得用你的真實路徑替換${destdir}):
% ${srcdir}/configure --prefix=${destdir} [其它選項]
例如,如果想將GCC 4.1.2安裝到/usr/local/gcc-4.1.2目錄下,則${destdir}就表示這個路徑。
在我的機器上,我是這樣配置的:


% ../gcc-4.1.2/configure --prefix=/usr/local/gcc-4.1.2 --enable-threads=posix --disable-checking --enable--long-long --host=i386-redhat-linux --with-system-zlib --enable-languages=c,c++,java


將GCC安裝在/usr/local/gcc-4.1.2目錄下,支持C/C++和JAVA語言,其它選項參見GCC提供的幫助說明。

5. 編譯
% make
6. 安裝
執行下面的命令將編譯好的庫文件等拷貝到${destdir}目錄中(根據你設定的路徑,可能需要管理員的權限):
% make install


至此,GCC 4.1.2安裝過程就完成了。

6. 其它設置
  GCC 4.1.2的所有文件,包括命令文件(如gcc、g++)、庫文件等都在${destdir}目錄下分別存放,如命令文件放在bin目錄下、庫文件在 lib下、頭文件在include下等。由於命令文件和庫文件所在的目錄還沒有包含在相應的搜索路徑內,所以必須要作適當的設置之後編譯器才能順利地找到 並使用它們。
6.1 gcc、g++、gcj的設置
要想使用GCC 4.1.2的gcc等命令,簡單的方法就是把它的路徑${destdir}/bin放在環境變量PATH中。我不用這種方式,而是用符號連接的方式實現,這樣做的好處是我仍然可以使用系統上原來的舊版本的GCC編譯器。


首先,查看原來的gcc所在的路徑:
  % which gcc
  在我的系統上,上述命令顯示:/usr/bin/gcc。因此,原來的gcc命令在/usr/bin目錄下。我們可以把GCC 4.1.2中的gcc、g++、gcj等命令在/usr/bin目錄下分別做一個符號連接:
  % cd /usr/bin
  % ln -s ${destdir}/bin/gcc gcc412
  % ln -s ${destdir}/bin/g++ g++412
  % ln -s ${destdir}/bin/gcj gcj412

  這樣,就可以分別使用gcc412、g++412、gcj412來調用GCC 4.1.2的gcc、g++、gcj完成對C、C++、JAVA程序的編譯了。同時,仍然能夠使用舊版本的GCC編譯器中的gcc、g++等命令。


6.2 庫路徑的設置
將${destdir}/lib路徑添加到環境變量LD_LIBRARY_PATH中,例如,如果GCC 4.1.2安裝在/usr/local/gcc-4.1.2目錄下,在RH Linux下可以直接在命令行上執行
% export LD_LIBRARY_PATH=/usr/local/gcc-4.1.2/lib

最好添加到系統的配置文件中,這樣就不必要每次都設置這個環境變量了,在文件$HOME/.bash_profile中添加下面兩句:
LD_LIBRARY_PATH=/usr/local/gcc-4.1.2/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH


重啟系統設置生效,或者執行命令
% source $HOME/.bash_profile


7. 測試
用新的編譯命令(gcc412、g++412等)編譯你以前的C、C++程序,檢驗新安裝的GCC編譯器是否能正常工作。

沒有留言:

張貼留言