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