本文是作者閱讀Linux開發(fā)相關(guān)圖書做的筆記之一,主要描述Linux上開發(fā)的環(huán)境基本知識(shí)。
1.應(yīng)用程序:
指一些工具和系統(tǒng)提供的程序;通常可在目錄/usr/bin中找到。系統(tǒng)管理員為特定的主機(jī)或本地網(wǎng)絡(luò)添加的程序在/usr/local/bin或/opt中找到。
建議在/usr/local目錄結(jié)構(gòu)下編譯運(yùn)行自己的程序,并訪問必要的文件,這樣可以在系統(tǒng)升級(jí)的時(shí)候值需要把這個(gè)目錄做備份就可以了。
其他一些功能和編程系統(tǒng)都可能有自己的目錄結(jié)構(gòu);例如X視窗在/usr/X11目錄下。
GNU編譯系統(tǒng)的驅(qū)動(dòng)程序gcc一般位于/usr/bin或/usr/local/bin目錄中,但會(huì)從其他目錄運(yùn)行各種編譯器支持的程序。
2.頭文件
C語言的一些頭文件,依賴特定Linux版本的頭文件在目錄/usr/include/sys和/usr/include/linux中找到。
其他編程系統(tǒng)也有自己的include目錄,但通常都能被搜索到;例如:GNU C++的/usr/include/g++
gcc編譯的時(shí)候使用-I選項(xiàng)來添加搜索目錄。
3.庫(kù)文件
庫(kù)文件通常是函數(shù)集合,可重用。標(biāo)準(zhǔn)系統(tǒng)庫(kù)文件一般在/lib和/usr/lib下。C語言編譯器(連接程序)會(huì)知道要搜索那些庫(kù)文件。
庫(kù)文件的名稱總是以lib開頭,后面說明說明庫(kù)(例如:c代表C語言庫(kù),m代表數(shù)學(xué)庫(kù)),文件名結(jié)尾以.跟上后綴來表示類型:
.a表示靜態(tài)庫(kù),類似windows的.lib
.so代表共享函數(shù)庫(kù),類似windows的.dll
在連接的時(shí)候使用-l來告訴編譯器搜索指定庫(kù)文件。另外對(duì)于某些特定庫(kù),可以使用縮寫來表示;例如:-lm表示數(shù)學(xué)庫(kù)(libm.a);而使用-L可以來為編譯器增加搜索路徑。
4.靜態(tài)庫(kù)
正如前面所說,靜態(tài)庫(kù)是.a結(jié)尾;通常也被叫做歸檔文件,可以使用ar程序和gcc -c名來創(chuàng)建自己的靜態(tài)庫(kù)。
靜態(tài)庫(kù)的缺點(diǎn)是:如果多個(gè)程序需要使用來自同一個(gè)靜態(tài)庫(kù)的函數(shù),那么這個(gè)函數(shù)的代碼在內(nèi)存中會(huì)出現(xiàn)多份;這造成額外的內(nèi)存浪費(fèi)。
5.動(dòng)態(tài)庫(kù)
為了克服靜態(tài)庫(kù)的缺點(diǎn)而設(shè)計(jì)的函數(shù)庫(kù)。以.so結(jié)尾。使用動(dòng)態(tài)庫(kù)的程序不連接具體函數(shù)代碼,而在運(yùn)行時(shí)將動(dòng)態(tài)庫(kù)裝載,并且訪問共享代碼。這樣在多個(gè)程序訪問一個(gè)共享庫(kù)的時(shí)候只需要在內(nèi)存中保存一份代碼。
在Linux系統(tǒng)中負(fù)載裝載和解析程序中引用的程序是ld.so。搜索共享庫(kù)的其他位置可以在文件/etc/ld.so.conf中配置;修改這個(gè)文件后需要使用ldconfig來處理。
可以使用ldd來查看程序需要哪些共享庫(kù)。
例如:對(duì)我自己寫的一個(gè)程序進(jìn)行l(wèi)dd,
ldd test,結(jié)果為:
linux.gate.so.1 => (ox...)
libc.so.6=>
括號(hào)內(nèi)的是庫(kù)的地址。