面向新手,Linux環境下安裝GCC所遇到的問題彙總

今天,博主接到一個任務,通過RPC實現windows和linux之間的通信,博主在網上找了N久未果,基本上都是說windows平臺下的RPC調用。於是博主想換一下思路,先找Linux下的RPC調用,然後再考慮兩者的通信。先裝linux吧,博主用的是Red hat9。在虛擬機上裝完想編譯一個IDL文件,傻眼了,red hat未裝GCC(linux系統下編程的編譯器),沒辦法,只好先裝GCC。於是,博主花了一個下午+一個晚上的時間解決安裝GCC時遇到的困難,終於用上GCC了。花了那麼長時間才裝上GCC,博主表示非常慚愧。剛剛接觸linux,此文的目的是總結一下學習經驗同時也爲那些和我一樣剛剛接觸linux的新手提供一個交流學習經驗的平臺,高手的話可以直接忽略此文。好了,閒話少說,下面是博主遇到的具體問題和解決方法。(有遺漏和有待改進之處,望請指正)

博主首先按照網上標準流程安裝GCC(安裝步驟如下)

-----------------------------------------------------------------------------------------------------------------------------------------------------

原文地址

下載 

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

解壓縮  

根據壓縮格式,選擇下面相應的一種方式解包(以下的“%”表示命令行提示符):
% tar xzvf gcc-3.4.0.tar.gz
或者 
% bzcat gcc-3.4.0.tar.bz2 | tar xvf -

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

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

建立目標目錄

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

例如,可以這樣建立一個叫 gcc-build 的目標目錄(與源目錄${srcdir}是同級目錄):
% mkdir gcc-build 
% cd gcc-build


以下的操作主要是在目標目錄 ${objdir} 下進行。

配置

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

配置是通過執行  ${srcdir}下的configure來完成的。其命令格式爲(記得用你的真實路徑替換${destdir})
% ${srcdir}/configure --prefix=${destdir} [其它選項]

例如,如果想將GCC 3.4.0安裝到/usr/local/gcc-3.4.0目錄下,則${destdir}就表示這個路徑。

在我的機器上,我是這樣配置的:
% ../gcc-3.4.0/configure --prefix=/usr/local/gcc-3.4.0 --enable-threads=posix --disable-checking --enable--long-long --host=i386-redhat-linux --with-system-zlib --enable-languages=c,c++,java

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

編譯
% make

這是一個漫長的過程。在我的機器上(P4-1.6),這個過程用了50多分鐘。

安裝

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

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

其它設置

GCC 3.4.0的所有文件,包括命令文件(如gcc、g++)、庫文件等都在${destdir}目錄下分別存放,如命令文件放在bin目錄下、庫文件在 lib下、頭文件在include下等。由於命令文件和庫文件所在的目錄還沒有包含在相應的搜索路徑內,所以必須要作適當的設置之後編譯器才能順利地找到並使用它們。

gcc、g++、gcj的設置

要想使用GCC 3.4.0的gcc等命令,簡單的方法就是把它的路徑  ${destdir}/bin放在環境變量PATH中。我不用這種方式,而是用符號連接的方式實現,這樣做的好處是我仍然可以使用系統上原來的舊版本的GCC編譯器。

首先,查看原來的gcc所在的路徑:
% which gcc

在我的系統上,上述命令顯示:/usr/bin/gcc。因此,原來的gcc命令在/usr/bin目錄下。我們可以把GCC 3.4.0中的gcc、g++、gcj等命令在/usr/bin目錄下分別做一個符號連接:
% cd /usr/bin
% ln -s ${destdir}/bin/gcc gcc34
% ln -s ${destdir}/bin/g++ g++34
% ln -s ${destdir}/bin/gcj gcj34

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

庫路徑的設置

將${destdir}/lib路徑添加到環境變量LD_LIBRARY_PATH中,最好添加到系統的配置文件中,這樣就不必要每次都設置這個環境變量了。

例如,如果GCC 3.4.0安裝在/usr/local/gcc-3.4.0目錄下,在RH Linux下可以直接在命令行上執行或者在文件/etc/profile中添加下面一句:

$LD_LIBRARY_PATH

測試

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

根據需要,可以刪除或者保留${srcdir}和${objdir}目錄。

-----------------------------------------------------------------------------------------------------------------------------------------------------

我是通過windows平臺下到網上搜來的安裝包,然後複製到U盤上,然後接到虛擬機上,最後掛接到linux系統上。發現linux下上網下載東西實在不方便,可能我剛剛接觸linux,高手莫笑!!!

掛接執行

#mkdir /mnt/udisk

#fdisk -l

#mount -t vfat /dev/sdb1 /mnt/udisk

這裏要注意的是接U盤到虛擬機時必須用鼠標點擊虛擬機後才插上U盤,這樣才能被Linux識別,不然很可能被windows識別了,會掛接失敗的。博主試了很多次,可憐我那剛買的U盤了。

-----------------------------------------------------------------------------------------------------------------------------------------------------

博主不才,在配置GCC安裝環境時(也就是執行# % ../gcc-3.4.0/configure --prefix=/usr/local/gcc-3.4.0 --enable-threads=posix --disable-checking --enable--long-long --host=i386-redhat-linux --with-system-zlib --enable-languages=c,c++,java 時)遇到configure: error: no acceptable C compiler found in $PATH 的問題,這個問題是因爲red hat9未裝C編譯器,或者C編譯器未包含到系統調用路徑中。於是,博主又就毛手毛腳地去鼓搗安裝C編譯器。去罈子裏搜安裝C編譯器步驟時,某高人指點說直接跳過此步,安裝GCC rpm,貌似是GCC編譯器的一個編譯後版本,然後安裝到linux上就可以了。於是博主又跑去鼓搗rpm。

gcc rpm安裝可參考http://www.5dlinux.com/article/3/2007/linux_8170.html

結果博主又一次失敗了,不過博主不氣餒。來分析一下問題,這次博主碰到的問題是在導入rpm文件時,新安裝的rpm文件與系統原有的文件發生衝突,linux終端提示conflict with .... 於是博主又去翻資料,找到一篇介紹初學者安裝RPM包快速應急手冊》,摘錄如下:

----------------------------------------------------------------------------------------------------------------------------------------------------

用RPM包方式來發布軟件變得越來越流行,主要的原因是這種軟件發佈方式很方便用戶安裝、升級和從系統中刪除。除此之外,RPM還可以讓你有更多的對系統安裝的軟件的管理性功能,例如可以查新系統有哪些已經安裝的軟件包,查看這些軟件包分別安裝了什麼文件,這些文件又放在了什麼地方等等。

   這裏我給出一個簡單的入門手冊,供初學者查看參考,快速使用RPM。這些RPM命令都是最最常用的,更復雜的功能大家可以暫時不用管,等確實需要的時候再去查man手冊。:)

   下面我們開始吧。安裝一個RPM包的一般採用的命令格式如下: 
   # rpm -ivh package.ix86.rpm 
   在上面的命令中,package是個假定的名字,ix86是這個包爲特定的CPU做了優化處理的意思。例如,package可能是ldconfig-1.9.5-14,而ix86是i386這樣的。 
   “-i”參數指明是要安裝這個package,而“-v”這個參數則使輸出信息增加,“-h”表示在安裝過程中顯示hashes作爲在安裝過程的一個進度條。 
   上面就是所有的關於安裝一個RPM包的內容,非常簡單而好用吧。當然如果你安裝過程中遇到了一些包依賴關係的問題那就稍微要麻煩一些了。包依賴關係問題就是說,你正在安裝的包需要其他的包的支持才能正常工作。通常還有可能遇到的問題是所安裝的包需要某個軟件或者函數庫的特定版本才能正常工作。這樣的情況下,你可以安裝或者升級依賴的軟件包,然後繼續安裝你自己需要安裝的軟件包。 
   下面我們來看其他的一些非常有用的rpm命令。 
   如果你要看一個RPM包安裝以後到底安裝了那些文件,你可以使用這個命令: 
   # rpm -ql packagename 
   這個packagename就是你要查詢的軟件包的名字,例如ldconfig-1.9.5-14mdk;而“-p”參數表示查詢軟件包數據庫,看這個軟件包是否已經安裝;“-l”參數表示列出所查詢的包的所有安裝了的文件的完整的路徑。
下面是一個例子: 
   [wh@infonet wh]$ rpm -ql ldconfig-1.9.5-14mdk
/sbin/ldconfig
/usr/doc/ldconfig-1.9.5
/usr/doc/ldconfig-1.9.5/README 
   除了你查詢某個軟件包的信息這個實用功能外,還可以很方便的刪除某個特定的RPM包軟件。採用的命令參數是“-e“,格式如下: 
   # rpm -e packagename 
   “-e”就表示刪除(erase)的意思,就是把特定的軟件包(packagename)刪除掉。 
   值得注意的是,rpm管理機制不允許你刪除某個軟件包,如果這個軟件包還被其他軟件包所依賴。因爲一旦你刪除了這個軟件包,其他依賴他才能運行的軟件包也就不能正常使用了。 
   已經學會了如何安裝和如何刪除一個rpm軟件包,下面我們看看如何升級一個已經存在的rpm包軟件。升級其實和安裝類似,可以參考下面的命令: 
   # rpm -Uvh package.ix86.rpm 
   “-U“參數表示是升級(upgrade),參數“v”和“h”意義和前面一樣的,這裏不再贅述。 
   到此,我們已經學會了,如何安裝、刪除和升級一個使用rpm發佈的軟件了。:)

-----------------------------------------------------------------------------------------------------------------------------------------------------

博主,心想如果導入rpm包發生衝突,不如就用#rpm -Uvh命令更新rpm文件,事實證明這招很管用,強烈建議選用更新命令導入rpm,這樣做的好處有兩點:1.如果原先存在rpm包,則導入操作不會引起衝突,而是直接升級至最新版本。2.如果原先不存在rpm包,則系統會提示不存在rpm,這時可以用-ivh命令而不用擔心留下髒文件,因爲你導入的文件就是系統所需要的,如果導入不成功,可刪也可升級。命令和效果不同,但殊途同歸,看個人選擇。可參見http://www.linuxidc.com/Linux/2007-09/7327.htm,很不幸的是博主在編譯binutils-2.15.tar.bz2執行./configure時又失敗,其實可以跳過編譯binutils-2.15這一項,直接執行下面的命令安裝rpm。但是要注意上面鏈接裏———都應改爲——,如———nodeps 應改爲——,而———replacefiles應改爲——replacefiles。
上文提到的GCC版本檢查指令很好用:

安裝完畢之後,我們用命令可以查看相關版本
  #gcc ---version /* 查看gcc版本 */
  #/lib/libc.so.6 /* 查看glibc的版本 */

如此一來,博主終於用上GCC了,但是回過頭編譯binutils-2.15.tar.bz2時又遇到configure: error: C compiler cannot create executables 的錯誤,此時夜已經深了,這個問題,博主也沒有解決,希望哪位路過的高手給指點一下,不勝感激。

另外附上一篇無比實用的rpm安裝總結

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章