Linux 探索之旅 | 第四部分第五課:原始碼編譯,安裝便利

程式設計師聯盟發表於2017-04-12

Linux 探索之旅 | 第四部分第五課:原始碼編譯,安裝便利

-- 作者 謝恩銘 轉載請註明出處

內容簡介


  1. 第四部分第五課:原始碼編譯,安裝便利
  2. 第四部分第六課預告

原始碼編譯,安裝便利


上一課 Linux探索之旅 | 第四部分第四課:分析網路,隔離防火 比較難。這一課比較輕鬆。

之前的課程 Linux探索之旅 | 第二部分第七課:軟體安裝,如虎添翼 中,我們已經瞭解過在Ubuntu這個Linux的發行版下安裝軟體是何等方便,用apt-get這個工具可以輕鬆搞定。這種方式可以讓我們下載並安裝大部分的軟體。

其他Linux發行版也類似,一通百通。

但是,有些軟體並沒有包含在軟體倉庫中,那麼我們只能手動來安裝了,也就是隻能下載軟體的原始碼,編譯以生成可執行檔案。

這個方式有時候會比較複雜。我們需要首先下載原始碼,下載下來的原始碼通常是一個壓縮包,解壓壓縮包,然後配置,再編譯,再安裝。

希望這一課能讓大家把之前學的一些知識應用到實踐中,我們一步步來探究軟體的編譯。

首先嚐試找deb安裝包


首先,我們得宣告:
這一部分涉及到的軟體包安裝等知識點是基於Debian一族的Linux發行版,包括Ubuntu。

其他不是Debian一族的Linux發行版,例如Fedora,Redhat,CentOS,等等。其實安裝軟體的方式大同小異,就是每個Linux發行版之間所用的命令不一樣,軟體包的名稱有點區別罷了。

大部分Ubuntu下的軟體都可以在軟體倉庫中找到,你只要用apt-get命令就可以安裝它們。但是,有少部分比較新的或者還在開發中的或者還不是很有名的軟體,就沒有被收錄到軟體倉庫中,那你就不能用apt-get來獲取到了。

在這種情況下,事情會變得複雜一些。在Windows下面,要安裝某個軟體,我們很習慣於先去軟體的官網,然後下載.exe結尾的安裝檔案。

然而,那些為Linux系統編寫軟體的程式設計師卻一般不建立類似Windows下的那些安裝檔案。為什麼呢?難道是因為Linux的程式設計師很懶惰嗎?

是的,Linux程式設計師是很懶惰。開玩笑啦。
其實是因為Linux存在極為多樣的發行版(比如Ubuntu,Fedora,CentOS,SUSE,等等),每個發行版又有不同版本號。而且又有不同的處理器種類(32位的和64位的CPU,ARM架構,Intel架構,等等)要適配,不像Windows因為是微軟自己定義,沒有太多變數。
因此,要為每種Linux建立一個安裝檔案幾乎成了不可能的事。

當我們要找的軟體不在Ubuntu的軟體倉庫中時,我們可以試試去軟體的官方網站找字尾是.deb(deb是Debian的縮寫)的安裝包。.deb的安裝包只能用於Debian一族的作業系統,包括Ubuntu。而Redhat一族(包括Fedora)用的則是字尾為.rpm(rpm是Redhat Package Manager的縮寫)的安裝包。

有個軟體可以幫忙將rpm安裝包轉換為deb安裝包。這個軟體是alien(就是“外星人”的意思,哈哈):

# alien預設沒有安裝,所以首先要安裝它。
sudo apt-get install alien複製程式碼
# 將rpm轉換為deb,完成後會生成一個同名的xxxx.deb。
sudo alien xxxx.rpm複製程式碼
# 安裝deb安裝包。注意,用alien轉換的deb包並不能保證100%順利安裝,所以可以找到deb最好直接用deb。
sudo dpkg -i xxxx.deb複製程式碼

如果你有幸直接在網上找到了軟體的deb安裝包,那麼下載下來,雙擊安裝包(或者用上面的命令列的形式:sudo dpkg -i xxxx.deb)來安裝即可。

然後一個視窗會彈出,問你是否確定安裝,選擇“安裝”。

如果安裝過程沒出錯,那很好。如果有錯誤,一般可能是因為:

  • 也許你下載的deb安裝包不符合你的電腦環境。可能位數搞錯了,32位和64位有區別的。

  • 也許你沒有安裝那些依賴軟體。因為apt-get工具會幫我們自動下載各種依賴軟體,所以不需要我們親自動手。但現在你需要自己動手安裝缺失的依賴軟體,可以根據提示資訊,缺什麼就裝什麼。

假如實在找不到deb安裝包,那麼只能:獲取軟體的原始碼,然後“自行了斷”(哦,不是,是自行編譯)。

那下面我們就來看看如何從原始碼出發直到編譯安裝完成咯。

實在沒有其他方法,選擇編譯安裝


如果你要安裝的軟體既不在軟體倉庫裡,你在網上又找不到相應的deb安裝包的話,你就只能回到“石器時代”,用編譯原始碼的方式來安裝了。

什麼是編譯?


簡單來說,編譯就是將程式的原始碼轉換成可執行檔案的過程。就好比我們做糕點,用到的原料(如雞蛋,麵粉等)等就是原始碼,而最終制成的蛋糕就是可執行檔案。在這個比喻中,編譯就是製作蛋糕的過程。

假如複雜地說就說不完了。

大多數Linux的程式都是開放原始碼的,我們可以比較輕易地獲取它們的原始碼,然後將其編譯成適合我們的電腦和作業系統屬性的可執行檔案。

編譯安裝軟體的步驟根據軟體的不同有所區別。有些軟體的編譯安裝非常複雜,可能會讓你抓狂(特別是一些非標準,非主流的軟體),需要很多準備工作。

小編以前在自學嵌入式的過程中對此深有體會。

不過一般安裝手冊(一般是下載下來原始碼時附帶的README文字檔案,read是英語“閱讀”的意思,me是英語“我”的賓語形式。所以read me就是“閱讀我”的意思)都會說明詳細的安裝步驟。

即使如此,有時還是會讓你比較頭大,只能解決一個個遇到的小錯誤。

沒辦法,誰讓程式設計師愛折騰呢,不折騰的人生有什麼意義,木啊哈哈。

一步步編譯程式


在編譯之前,你需要安裝編譯的工具。在Ubuntu下有一個方法可以一次性安裝跟編譯有關的工具,就是build-essential(build是“構建”或“編譯”的意思,essential是“必要的”的意思,顧名思義就是“進行構建/編譯所需的必要工具”),執行如下命令安裝:

sudo apt-get install build-essential複製程式碼

一句命令搞定,Linux之威武帥氣展露無遺。

Windows君基本已經哭暈在廁所~ (日常黑Windows任務又完成了,哈哈)。

安裝完編譯需要的基本工具,我們就可以開工了。

我們就用一個小軟體作為例子來講解吧。這個軟體是htop。之前我們學過top命令,它可以檢視電腦中執行的各種程式狀態,佔用多少記憶體,cpu用量等等,有點類似Windows中的工作管理員。htop就是類似於top的一個小軟體。

雖然htop這個軟體從apt-get中也可以安裝。但是我們為了演示編譯安裝的過程,就拿它來“開刀”啦(可憐的htop)。

Linux 探索之旅 | 第四部分第五課:原始碼編譯,安裝便利

之前寫這篇文章是htop最新版還是1.0.3版,今天(2016年12月17日)去官網看的時候最新版已經是2.0.2了,不過安裝過程是類似的。

點選選單中的 [Downloads],目前這個軟體的開發原始碼託管在Github上,Github的相關頁面:github.com/hishamhm/ht… (可以上去看看,熟悉一下全球聞名的Github)

也可以閱讀我的以下三篇文章,順便學習一下Git和Github兩大超級厲害的生產力工具的使用:

雖然htop的原始碼託管在Github上,但其穩定的釋出版本不是放在Github上,而是以tar.gz的壓縮包格式存放在:

hisham.hm/htop/releas…

hisham.hm/htop/releas…

  • 下載以下檔案
htop-1.0.3.tar.gz複製程式碼
tar zxvf htop-1.0.3.tar.gz複製程式碼

解壓後生成了htop-1.0.3這個目錄。

  • 然後進入目錄中:
cd htop-1.0.3複製程式碼

假如用ls命令來列出檔案,你會發現有好多,不要怕。我們並不需要在意這些細節...

在眾多檔案中,我們對一個檔案比較感興趣:

configure

configure是英語“配置”的意思,顧名思義就是為軟體的編譯做一些配置和準備工作。

  • 我們執行它:
./configure複製程式碼

configure這個程式會分析你的電腦,確認是否編譯所必須的所有工具都安裝了。它的執行需要些時間,因為要做不少檢測。

結果檢測出現了錯誤:

Linux 探索之旅 | 第四部分第五課:原始碼編譯,安裝便利

錯誤是:

沒有找到 -lncursesw複製程式碼

提示資訊是:

error: You may want to use --disable-unicode or install libncursesw複製程式碼

意思是:“出錯啦:你也許想要用 --disable-unicode 引數 或者 安裝libncursesw”。

  • 首先小編到網上去找了安裝libncursesw的方法,都不行。所以為了快速起見,就不折騰了。直接用第一個建議:用 --disable-unicode 引數。

  • 重新執行configure(加上 --disable-unicode 引數):

./configure --disable-unicode複製程式碼

這會沒錯誤了。

  • 然後我們就可以開始編譯了。用make命令:
make複製程式碼

也沒錯誤,編譯完成。

  • 最後一步用make install命令來安裝 (需要加上sudo以用root許可權來安裝軟體):
sudo make install複製程式碼
  • 沒有問題。安裝完成。然後執行htop軟體試試:
htop複製程式碼

Linux 探索之旅 | 第四部分第五課:原始碼編譯,安裝便利

  • 大功告成,收工~

下一課會比較難,內容也會很多。我們來好好探究一下IP地址,域名和DNS域名解析系統的來龍去脈。

總結


  1. 大多數Linux發行版的軟體都可以用包管理工具apt-get來安裝(對於Debian一族)。

  2. 有些軟體不能通過apt-get來安裝,因為沒有被收錄到Ubuntu的軟體倉庫中。在這種情況下,我們可以試著在網上找軟體的deb安裝包。

  3. 假如前兩種方法都不行,我們只能選擇從原始碼編譯安裝的方法。一般通用的步驟如下:

    1 從網上下載程式的原始碼(通常被打包壓縮為 .tar.gz 的格式)。

    2 解壓壓縮包(tar zxvf xxx.tar.gz)。

    3 執行解壓之後的資料夾裡的configure檔案: ./configure。

    4 執行make來編譯。

    5 執行sudo make install完成安裝。

第四部分第六課預告


今天的課就到這裡,一起加油吧!

下一課我們學習:DNS和域名,一探究竟


微信公眾號「程式設計師聯盟」ProgrammerLeague
我是謝恩銘,在巴黎奮鬥的軟體工程師。
我的簡介
我的經歷
熱愛生活,喜歡游泳,略懂烹飪。
人生格言:“向著標杆直跑”

相關文章