Note For Linux By Jes(16)-软件安装:原始码与 Tarball
開放源碼的軟件安裝與升級簡介:
什么是開放源碼、編譯器與可運行檔
什么是函式庫:
什么是make與configure:
偵測程序會偵測的數(shù)據(jù)大約有底下這些:
-
是否有適合的編譯器可以編譯本軟件的程序碼;
-
是否已經(jīng)存在本軟件所需要的函式庫,或其他需要的相依軟件;
-
操作系統(tǒng)平臺是否適合本軟件,包括Linux的核心版本;
-
核心的表頭定義檔(header include)是否存在(驅(qū)動程序必須要的偵測)。
什么是Tarball的軟件:
Tarball 是一個軟件包,你將他解壓縮之后,里面的文件通常就會有:
-
原始程序碼文件;
-
偵測程序文件(可能是configure或config等檔名);
-
本軟件的簡易說明與安裝說明(INSTALL或README)。
如何安裝與升級軟件:
將Tarball由廠商的網(wǎng)頁下載下來;
將Tarball解開,產(chǎn)生很多的原始碼文件;
開始以gcc進行原始碼的編譯(會產(chǎn)生目標檔object files);
然后以gcc進行函式庫、主、副程序的連結(jié),以形成主要的binary file;
將上述的binary file以及相關的配置檔安裝至自己的主機上面。
使用傳統(tǒng)程序語言進行編譯的簡單范例:
單一程序:印出Hello World:
編輯程序碼,亦即原始碼
開始編譯與測試運行
主、副程序連結(jié):副程序的編譯:
撰寫所需要的主、副程序
進行程序的編譯與連結(jié)(Link)
呼叫外部函式庫:加入連結(jié)的函式庫
編譯時加入額外函式庫連結(jié)的方式:gccsin.c -lm -L/lib -L/usr/lib;gcc sin.c -lm -I/usr/include
-
-l:是『加入某個函式庫(library)』的意思,
-
m :則是libm.so這個函式庫,其中,lib與擴展名(.a或.so)不需要寫
-lm 表示使用libm.so (或libm.a)這個函式庫的意思~至於那個-L后面接的路徑呢?這表示:『我要的函式庫libm.so 請到/lib或/usr/lib里面搜尋!』
-I/path 后面接的路徑(Path )就是配置要去搜尋相關的include文件的目錄
gcc 的簡易用法(編譯、參數(shù)與鏈結(jié)):
| # 僅將原始碼編譯成為目標檔,并不制作連結(jié)等功能: [root@www ~]# gcc -c hello.c # 會自動的產(chǎn)生 hello.o 這個文件,但是并不會產(chǎn)生 binary 運行檔。# 在編譯的時候,依據(jù)作業(yè)環(huán)境給予最佳化運行速度 [root@www ~]# gcc -O hello.c -c # 會自動的產(chǎn)生 hello.o 這個文件,并且進行最佳化喔!# 在進行 binary file 制作時,將連結(jié)的函式庫與相關的路徑填入 [root@www ~]# gcc sin.c -lm -L/usr/lib -I/usr/include # 這個命令較常下達在最終連結(jié)成 binary file 的時候, # -lm 指的是 libm.so 或 libm.a 這個函式庫文件; # -L 后面接的路徑是剛剛上面那個函式庫的搜尋目錄; # -I 后面接的是原始碼內(nèi)的 include 文件之所在目錄。# 將編譯的結(jié)果輸出成某個特定檔名 [root@www ~]# gcc -o hello hello.c # -o 后面接的是要輸出的 binary file 檔名# 在編譯的時候,輸出較多的信息說明 [root@www ~]# gcc -o hello hello.c -Wall # 加入 -Wall 之后,程序的編譯會變的較為嚴謹一點, # 所以警告信息也會顯示出來! |
用make進行巨集編譯:
[root@www ~]# vi makefile LIBS = -lm OBJS = main.o haha.o sin_value.o cos_value.o main: ${OBJS}gcc -o main ${OBJS} ${LIBS} clean:rm -f main ${OBJS}變量與變量內(nèi)容以『=』隔開,同時兩邊可以具有空格;
變量左邊不可以有<tab>,例如上面范例的第一行LIBS左邊不可以是<tab>;
變量與變量內(nèi)容在『=』兩邊不能具有『:』;
在習慣上,變量最好是以『大寫字母』為主;
運用變量時,以${變量}或$(變量)使用;
在該shell的環(huán)境變量是可以被套用的,例如提到的CFLAGS這個變量!
在命令列模式也可以給予變量。
由於gcc在進行編譯的行為時,會主動的去讀取CFLAGS這個環(huán)境變量,所以,你可以直接在shell定義出這個環(huán)境變量
[root@www ~]# vi makefile LIBS = -lm OBJS = main.o haha.o sin_value.o cos_value.o CFLAGS = -Wall main: ${OBJS}gcc -o main ${OBJS} ${LIBS} clean:rm -f main ${OBJS}由於gcc在進行編譯的行為時,會主動的去讀取CFLAGS這個環(huán)境變量,所以,你可以直接在shell定義出這個環(huán)境變量,也可以在makefile文件里面去定義,更可以在命令列當中給予:
make 命令列后面加上的環(huán)境變量為優(yōu)先;
makefile 里面指定的環(huán)境變量第二;
shell 原本具有的環(huán)境變量第三。
$@:代表目前的標的(target)
Tarball的管理與建議:
使用原始碼管理軟件所需要的基礎軟件:gcc或cc等C語言編譯器(compiler),make及autoconfig等軟件,需要Kernel提供的Library以及相關的Include文件
Tarball 安裝的基本步驟:
取得原始檔:將tarball文件在/usr/local/src目錄下解壓縮;
取得步驟流程:進入新創(chuàng)建的目錄底下,去查閱INSTALL與README等相關文件內(nèi)容(很重要的步驟!);
相依屬性軟件安裝:根據(jù)INSTALL/README的內(nèi)容察看并安裝好一些相依的軟件(非必要);
創(chuàng)建makefile:以自動偵測程序(configure或config)偵測作業(yè)環(huán)境,并創(chuàng)建Makefile這個文件;
編譯:以make這個程序并使用該目錄下的Makefile做為他的參數(shù)配置檔,來進行make (編譯或其他)的動作;
安裝:以make這個程序,并以Makefile這個參數(shù)配置檔,依據(jù)install這個標的(target)的指定來安裝到正確的路徑!
安裝的命令下達方式:
./configure
這個步驟就是在創(chuàng)建Makefile這個文件羅!通常程序開發(fā)者會寫一支scripts來檢查你的Linux系統(tǒng)、相關的軟件屬性等等,這個步驟相當?shù)闹匾?#xff0c;因為未來你的安裝資訊都是這一步驟內(nèi)完成的!另外,這個步驟的相關資訊應該要參考一下該目錄下的README或INSTALL相關的文件!
make clean
make 會讀取Makefile中關於clean的工作。這個步驟不一定會有,但是希望運行一下,因為他可以去除目標文件!因為誰也不確定原始碼里面到底有沒有包含上次編譯過的目標文件(*.o)存在,所以當然還是清除一下比較妥當?shù)?。至少等一下新編譯出來的運行檔我們可以確定是使用自己的機器所編譯完成的嘛!
make
make 會依據(jù)Makefile當中的默認工作進行編譯的行為!編譯的工作主要是進行gcc來將原始碼編譯成為可以被運行的object files,但是這些object files通常還需要一些函式庫之類的link后,才能產(chǎn)生一個完整的運行檔!使用make就是要將原始碼編譯成為可以被運行的可運行檔,而這個可運行檔會放置在目前所在的目錄之下,尚未被安裝到預定安裝的目錄中;
make install
通常這就是最后的安裝步驟了,make會依據(jù)Makefile這個文件里面關於install的項目,將上一個步驟所編譯完成的數(shù)據(jù)給他安裝到預定的目錄中,就完成安裝啦!
一般Tarball軟件安裝的建議事項(如何移除?升級?):
最好將tarball的原始數(shù)據(jù)解壓縮到/usr/local/src當中;
安裝時,最好安裝到/usr/local這個默認路徑下;
考慮未來的反安裝步驟,最好可以將每個軟件單獨的安裝在/usr/local底下;
為安裝到單獨目錄的軟件之man page加入man path搜尋:
如果你安裝的軟件放置到/usr/local/software/,那么man page搜尋的配置中,可能就得要在/etc/man.config內(nèi)的40~50行左右處,寫入如下的一行:
利用patch升級原始碼
函式庫管理:
動態(tài)與靜態(tài)函式庫
靜態(tài)函式庫的特色:
-
擴展名:(擴展名為.a)
這類的函式庫通常擴展名為libxxx.a的類型; -
編譯行為:
這類函式庫在編譯的時候會直接整合到運行程序當中,所以利用靜態(tài)函式庫編譯成的文件會比較大一些喔; -
獨立運行的狀態(tài):
這類函式庫最大的優(yōu)點,就是編譯成功的可運行檔可以獨立運行,而不需要再向外部要求讀取函式庫的內(nèi)容(請參照動態(tài)函式庫的說明)。 -
升級難易度:
雖然運行檔可以獨立運行,但因為函式庫是直接整合到運行檔中,因此若函式庫升級時,整個運行檔必須要重新編譯才能將新版的函式庫整合到程序當中。也就是說,在升級方面,只要函式庫升級了,所有將此函式庫納入的程序都需要重新編譯!
動態(tài)函式庫的特色:
-
擴展名:(擴展名為.so)
這類函式庫通常擴展名為libxxx.so的類型; -
編譯行為:
動態(tài)函式庫與靜態(tài)函式庫的編譯行為差異挺大的。與靜態(tài)函式庫被整個捉到程序中不同的,動態(tài)函式庫在編譯的時候,在程序里面只有一個『指向(Pointer)』的位置而已。也就是說,動態(tài)函式庫的內(nèi)容并沒有被整合到運行檔當中,而是當運行檔要使用到函式庫的機制時,程序才會去讀取函式庫來使用。由於運行檔當中僅具有指向動態(tài)函式庫所在的指標而已,并不包含函式庫的內(nèi)容,所以他的文件會比較小一點。 -
獨立運行的狀態(tài):
這類型的函式庫所編譯出來的程序不能被獨立運行,因為當我們使用到函式庫的機制時,程序才會去讀取函式庫,所以函式庫文件『必須要存在』才行,而且,函式庫的『所在目錄也不能改變』,因為我們的可運行檔里面僅有『指標』亦即當要取用該動態(tài)函式庫時,程序會主動去某個路徑下讀取,呵呵!所以動態(tài)函式庫可不能隨意移動或刪除,會影響很多相依的程序軟件喔! -
升級難易度:
雖然這類型的運行檔無法獨立運行,然而由於是具有指向的功能,所以,當函式庫升級后,運行檔根本不需要進行重新編譯的行為,因為運行檔會直接指向新的函式庫文件(前提是函式庫新舊版本的檔名相同喔!)。
ldconfig 與/etc/ld.so.conf
將庫加載到高速緩存
首先,我們必須要在/etc/ld.so.conf里面寫下『想要讀入高速緩存當中的動態(tài)函式庫所在的目錄』,注意喔,是目錄而不是文件;
接下來則是利用ldconfig這個運行檔將/etc/ld.so.conf的數(shù)據(jù)讀入緩存當中;
同時也將數(shù)據(jù)記錄一份在/etc/ld.so.cache這個文件當中吶!
程序的動態(tài)函式庫解析:ldd
判斷某個可運行的binary文件含有什么動態(tài)函式庫
檢驗軟件的正確性:
檢驗軟件正確性:md5sum/ sha1sum
總結(jié)
以上是生活随笔為你收集整理的Note For Linux By Jes(16)-软件安装:原始码与 Tarball的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Anaconda3 安装 爬虫库 sel
- 下一篇: linux 其他常用命令