Linux作業系統上編譯程式的方法詳細介紹

hzczichao發表於2010-07-09

每個人遲早都要下載程式的原始碼,然後試著編譯它。如果你是RedHat或Debian的忠實追隨者,你最終會發現一個程式不是太老就是太新,而去找已經編譯過的二進位制程式碼。

[@more@]壞的一方面是這些程式碼可能無論你怎麼做,它們永遠不能被正確的編譯記住,大多數的Linux程式最多隻是beta測試版。好的一方面是在過去的五年中編譯沒有問題的程式正在增加,而且即使你不是程式設計師,你也可以“修復”那些不能正確編譯程式碼。下載以後,現在你的硬碟上應該有一個某種型別的壓縮包。首先,你必須把它解壓(uncompress),並把它解包(untar)到一個目錄。在習慣上,很多人都把它們放到這個目錄:/usr/src。這樣能把所有的東西都放在一個地方,你以後可以清除它們。使用這個目錄需要有root身份。如果一個用tar打包的檔案是用gzip壓縮的,則Linux的tar程式可以同時把它解壓和解包。如果你的檔名叫做:filename.tar.gz,你可以到/usr/src目錄,然後鍵入:

tar -xzvf /{path to file}/{filename.tar.gz} [Enter]

這將會把這個檔案解壓並解包。這裡是幾個引數簡單的解釋:x -把檔案解包z -把檔案解壓v -顯示處理過程f -後面跟著你要處理的打包檔名如果你用netscape下載的這個檔案,可能會看到錯誤。有時netscape會為你解壓這個檔案。

因此,如果你象上面這樣untar它,你可能會看到這樣的資訊:

gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error exit delayed from previous errors

試著執行上面的命令,但把z引數刪掉,就是這樣:tar -xvf /{path to file}/{filename.tar.gz} [Enter] 除了gzip,有些檔案是用bzip2來壓縮的,因此這些檔案看起來象這樣the-program.tar.bz2。z引數對這種檔案不起作用。解開這種檔案最簡單的方法就是bunzip2 the-program.tar.bz2。這樣將把使用下面命令解包出來的the-program.tar檔案解開:

tar -xvf /{path to file}/{filename.tar.gz} [Enter]

解包以後:

cd到剛才解包時建立的那個目錄裡。用ls看看這個目錄裡的檔案。首先你應該讀讀README和INSTALL檔案。如果你沒讀這些檔案,不要想從別人那裡得到幫助。這是RTFM這個縮寫在網上使用很廣泛的原因(RTFM是`Read The Fucking Manual'的縮寫。README和INSTALL檔案將會告訴你如何編譯和安裝這個程式。

要編譯它,執行"make"命令。為了讓"make"可以開始編譯,必須有個叫Makefile的檔案(你也可以透過在命令列上來寫入make的引數,但那不在本文的討論範圍只內)有通常三個方法開始編譯:simple,Imake和configure。

Simple編譯:

如果你看到一個叫Makefile的檔案--沒有叫Imake或configure的檔案,那麼你就使用這個方法來編譯。因為不能為你的計算機設定,所以用這種方法來編譯有很多問題。通常README和INSTALL檔案會告訴你如何編輯某些檔案來使它可以正常編譯。通常,你可以這樣做:

make [Enter] make install [Enter]

如果一切正常,那麼你現在就可以執行這個程式了。

Imake: 如果ls這個目錄看到有Imake檔案,並且沒有Makefile,那麼你就使用這個方法。這是一個設定編譯的比較老的方法。基本上你要鍵入:

xmkmf [Enter] make [Enter] make install [Enter] Configure:

如果這個目錄中有個叫configure的檔案,那就要用這個方法。這是編譯程式最簡單的方法,而且編譯成功率很高。本質上,它會檢查你的這個系統,來檢視每一個可能的哭和支援檔案來確保你可以編譯這個程式,然後根據這些正確的資訊來建立Makefile檔案。如下執行:

./configure [Enter] make [Enter] make install [Enter]

注意第一個命令前面的./。當你鍵入一個命令的時候,shell會在你的路徑裡查詢檔案。它不從當前目錄開始查詢,因此如果./(代表當前目錄)沒有在路徑裡,雖然ls看的見這個檔案,但是shell卻找不到。shell能執行make是因為它通常都在/usr/bin裡,而/usr.bin在路徑裡。要看路徑,如下執行:

echo $PATH [Enter]

如果出現錯誤:

不能編譯的最常見錯誤原因是找不到檔案。幾乎所有的程式都靠有些程式,檔案或庫的支援。如果它們找不到,程式就不能編譯。README/INSTALL檔案應該告訴編譯這個程式所需要哪些檔案,和這些檔案的版本。注意:錯誤的版本會象根本沒有這個檔案一樣讓你不能編譯。通常,你要知道是不是這個問題可以從編譯程式輸出結尾的錯誤資訊中得知,這些資訊將告訴你找不到什麼檔案。注意:有時你有這些檔案,但是它們不在Makefile檔案所指明的地方。使用linux的釋出安裝程式,例如rpm,來檢查你是否丟失了某些檔案。如果沒有這些檔案的話,去找它,如果有,並且版本正確,檢查Makefile檔案看看它要求這個檔案放在什麼地方。例如:moc檔案在/usr/local/bin裡,但是Makefile說:moc=/opt/bin/moc。編輯一下Makefile(用vi或者任何什麼文字編輯器)然後改一下moc的路徑即可。

另一個常見的錯誤是丟掉了"include"的檔案。很多程式的中的原檔案的頭幾行是這樣的:

#include #include #include #include

這些"h"檔案(或者叫標頭檔案)必須存在於你的計算機裡。最少你應該有核心的標頭檔案,使用ls /usr/include/linux檢視。如果你安裝了一些庫,象gtk,確定也安裝了它們的開發檔案。有時同一個庫的幾個版本可能導致一些問題,每個版本可能把它的標頭檔案放在不同的地方,可你並不知道編譯的時候使用的到底是哪個檔案。

如果你改變了Makefile中的所有應該改變的地方,並且所有的庫和標頭檔案都對,而它仍然不能編譯,那麼順序如下做:

1、如果你是從一個和這個程式的主站不同的另外一個站點下載的這個程式,那麼去它的主站看看有沒有更新的版本可以使用。

2、去dejanews.com這個站點,搜尋一下這個程式。這裡很可能有其他人遇到了同樣的問題,並且已經貼出來瞭解決方法。

3、如果所有的方法都不行的話,email給作者。很多作者對改進他們的程式以及bug報告和效能建議都很有興趣,通常都會被很好的接受(記注:這是linux,不是商業軟體。)注意:你的bug報告最好多說些關鍵的情況,不要只說一句"這個程式不能編譯"!我通常是email過去編譯結果的最後十行或更多行,這樣作者才能看到是那裡出現的錯誤。如果我真的喜歡這個程式,我會在下一個新版本釋出以後儘可能給作者游泳的反饋。注意,程式設計師也是人--他們會有兩個星期的休假、跳槽、搬家等等其他十五,因此不要期望能夠立即得到回覆。最後,有些程式有唯一的編譯設定:馬上能想到的有qt和核心,我再最後重複一遍:讀README和INSTALL檔案。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23595918/viewspace-1035108/,如需轉載,請註明出處,否則將追究法律責任。

相關文章