天天看點

源碼編譯安裝

linux中安裝程式有兩種方式,下載下傳源碼編譯安裝和利用已經編譯好的RPM(yum)安裝

1.編譯源碼和tarball

使用類似 gcc 的編譯器來進行編譯的過程并不簡單,因為一套軟體并不會僅有一支程式, 而是有一堆源程式檔案。是以除了每個主程式與副程式均需要寫上一筆編譯過程的指令外,還需要寫上最終的連結程式。

此時,make指令就顯得比較重要了。當執行 make 時,make 會在當時的目錄下搜尋 Makefile (or makefile) 這個文字檔,而 Makefile 裡面則記錄了原始碼如何編譯的詳細資訊! make 會自動的判别原始碼是否經過變動了,而自動更新執行檔,是相當好用的一個輔助工具

那 Makefile 怎麼寫? 通常軟體開發商都會寫一支偵測程式來偵測使用者的操作環境, 以及該操作環境是否有軟體開發商所需要的其他功能,該偵測程式偵測完畢後,就會主動的建立這個 Makefile 的規則檔案啦!通常這支偵測程式的檔案名為 configure 或者是 config

具體過程如下圖所示:

源碼編譯安裝

Tarball 是一個軟體包,通常是*.tar.gz(gzip壓縮), 或者*.tar.bzp2(bzip2)格式,解壓後,裡面通常包含有:

原始程式源碼檔案;

偵測程式檔案 (可能是 configure 或 config 等檔名);

本軟體的簡易說明與安裝說明 (INSTALL 或 README)。

那麼一個軟體的 Tarball 是如何安裝的呢?基本流程是這樣的啦:

将 Tarball 由廠商的網頁下載下傳下來;

将 Tarball 解開,産生很多的原碼檔案;

開始以 gcc 進行原始碼的編譯 (會産生目标檔 object files);

然後以 gcc 進行函式庫、主、副程式的連結,以形成主要的 binary file;

将上述的 binary file 以及相關的設定檔安裝至自己的主機上面。

上面第 3, 4 步驟當中,我們可以透過 make 這個指令的功能來簡化。

下面的程式時手動編譯的過程,比較繁瑣,如果想要重新編譯的話,就要再從頭到尾執行一遍,如果是大型程式的話就要累死個人啊

make指令可以簡化這個過程。

make 有這些好處:

簡化編譯時所需要下達的指令;

若在編譯完成之後,修改了某個原碼檔案,則 make 僅會針對被修改了的檔案進行編譯,其他的 object file 不會被更動;

最後可以依照相依性來更新 (update) 執行檔。

2.執行make指令需要makefile,makefile的文法規則:

如下所示:

其中make指令即make main(main可以省略)

makefile裡面也可以使用變量功能,規則與shell變量略有不同:

一般tarball的安裝過程:

./configure

這個步驟就是在建立 Makefile 這個檔案啰!通常程式開發者會寫一支 scripts 來檢查你的 Linux 系統、相關的軟體屬性等等,這個步驟相當的重要, 因為未來你的安裝資訊都是這一步驟内完成的!另外,這個步驟的相關資訊應該要參考一下該目錄下的 README 或 INSTALL 相關的檔案!

一般來說 configure 設定參數較重要的就是那個 --prefix=/path 了,--prefix 後面接的路徑就是‘這個軟體未來要安裝到那個目錄去?’如果你沒有指定 --prefix=/path 這個參數,通常預設參數就是 /usr/local 至于其他的參數意義就得要參考 ./configure --help 了

make clean

make 會讀取 Makefile 中關于 clean 的工作。這個步驟不一定會有,但是希望執行一下,因為他可以去除目标檔案!因為誰也不确定原始碼裡面到底有沒有包含上次編譯過的目标檔案 (*.o) 存在,是以當然還是清除一下比較妥當的。 至少等一下新編譯出來的執行檔我們可以确定是使用自己的機器所編譯完成的嘛!

make

make 會依據 Makefile 當中的預設工作進行編譯的行為!編譯的工作主要是進行 gcc 來将原始碼編譯成為可以被執行的 object files ,但是這些 object files 通常還需要一些函式庫之類的 link 後,才能産生一個完整的執行檔!使用 make 就是要将原始碼編譯成為可以被執行的可執行檔,而這個可執行檔會放置在目前所在的目錄之下, 尚未被安裝到預定安裝的目錄中;

make install

通常這就是最後的安裝步驟了,make 會依據 Makefile 這個檔案裡面關于 install 的項目,将上一個步驟所編譯完成的資料給他安裝到預定的目錄中,就完成安裝啦!

為了友善 Tarball 的管理,通常鳥哥會這樣建議使用者:

最好将 tarball 的原始資料解壓縮到 /usr/local/src 當中;

安裝時,最好安裝到 /usr/local 這個預設路徑下;

考慮未來的反安裝步驟,最好可以将每個軟體單獨的安裝在 /usr/local 底下;

為安裝到單獨目錄的軟體之 man page 加入 man path 搜尋:

如果你安裝的軟體放置到 /usr/local/software/ ,那麼 man page 搜尋的設定中,可能就得要在 /etc/man.config 内的 40~50 行左右處,寫入如下的一行:

MANPATH /usr/local/software/man

Tarball的更新可以利用diff和patch指令來完成(不過我覺得這個好像用不太到,用到再說吧)

3.函式庫管理

依據函式庫被使用的類型而分為兩大類,分别是靜态 (Static) 與動态 (Dynamic) 函式庫兩類。

靜态函數庫一般以libxxx.a命名,直接内置程序式中,程式編譯成功後不再需要連結外部函數庫,但更新不是很友善。

動态函數庫一般以libxxx.so命名,連結程序式中,相對比較獨立,友善更新,一般動态函數庫比較流行。

如果我們将常用到的動态函式庫先載入記憶體當中 (快取, cache),如此一來,當軟體要取用動态函式庫時,就不需要從頭由硬碟裡面讀出啰! 這樣不就可以增進動态函式庫的讀取速度?沒錯,是這樣的!這個時候就需要 ldconfig 與 /etc/ld.so.conf 的協助了。

利用ldd指令可以檢視程式連結的動态函數庫。

4.md5sum / sha1sum

網上下載下傳的源碼一般都有用MD5或者sha1算法得到數字指紋,防止篡改。

md5sum / sha1sum指令就可以得到檔案的MD5和SHA1碼。

繼續閱讀