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