国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Linux > 正文

新手學(xué)堂:Windows與Linux系統(tǒng)下的庫介紹

2024-08-27 23:58:05
字體:
供稿:網(wǎng)友

什么是庫

庫文件是一些預(yù)先編譯好的函數(shù)的集合,那些函數(shù)都是按照可再使用的原則編寫的。它們通常由一組互相關(guān)聯(lián)的用來完成某項(xiàng)常見工作的函數(shù)構(gòu)成,從本質(zhì)上來說庫是一種可執(zhí)行代碼的二進(jìn)制形式,可以被操作系統(tǒng)載入內(nèi)存執(zhí)行。

無論在Windows平臺還是在Linux平臺下都存在大量的庫,但由于Windows和Linux的本質(zhì)不同,因此二者的庫的二進(jìn)制是不兼容的。

庫的分類

Windows下的庫有兩種:靜態(tài)庫(.lib)和動態(tài)鏈接庫(.dll)。

Linux下的庫有兩種:靜態(tài)庫(.a)和共享庫(.so)。

Linux下的靜態(tài)庫的名字一般為libxxxx.a,其中xxxx是該lib的名稱

Linux下的動態(tài)庫的名字一般為libxxxx.so.major.minor,xxxx是該lib的名稱,major是主版本號,minor是副版本號。

Windows下的庫與Linux下的庫的異同

Linux的共享庫(.so)就象Windows的動態(tài)鏈接庫(.dll),它里面包含有很多程序常用的函數(shù)。為了方便程序開發(fā)和減少程序的冗余,程序當(dāng)中就不用包含每個常用函數(shù)的拷貝,只是在需要時調(diào)用共享庫中常函數(shù)即可。這種方式我們稱之為動態(tài)鏈接(Dynamically Linked)。而有時我們不希望叫程序去調(diào)用共享庫的函數(shù),而是把庫函數(shù)代碼直接鏈接進(jìn)程序代碼中,也就是說,在程序本身擁有一份共享庫中函數(shù)的副本。這種方式我們稱之為靜態(tài)鏈接(Statically Linked)。

所以,簡單的講靜態(tài)庫和共享庫(動態(tài)庫)的不同點(diǎn)在于代碼被載入的時刻不同。

靜態(tài)庫的代碼在編譯過程中已經(jīng)被載入可執(zhí)行程序,因此體積較大。

共享庫的代碼是在可執(zhí)行程序運(yùn)行時才載入內(nèi)存的,在編譯過程中僅簡單的引用,因此代碼體積較小。

Windows下的動態(tài)鏈接庫(.dll)與Linux下的共享庫(.so)的差別

.dll文件事實(shí)上和.exe文件一樣,同屬 PE 格式的執(zhí)行文件。對于隱式的引用外部符號,需要把外部符號所在的位置寫在PE頭上。PE加載器將從PE頭上找到依賴的符號表,并加載依賴的其它.dll文件。

而在Linux 上并非如此!.so文件大多為elf執(zhí)行文件格式。當(dāng)它們需要的外部符號,可以不寫明這些符號所在的位置。也就是說,通常.so文件本身并不知道它依賴的那些符號在哪些.so里面。這些符號是由調(diào)用dlopen的進(jìn)程運(yùn)行時提供的。

我們在Windows下做一個.dll文件時還需要攜帶一個.lib文件;而在Linux下一般只需要有相應(yīng)的頭文件就夠了。對于編寫新的.so,找不到的符號可以就讓它在那里,直到最終執(zhí)行文件來把所有需要的符號聯(lián)合到一起。windows 可以存在一個.dll對另一個.dll的隱式依賴;而Linux下一般不需要讓.so和.so有隱式依賴關(guān)系.

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 临城县| 彩票| 建始县| 呼图壁县| 庆城县| 太原市| 乐山市| 隆昌县| 达孜县| 外汇| 政和县| 洞口县| 工布江达县| 乐平市| 兴安县| 无极县| 邯郸县| 吴川市| 修文县| 新晃| 无极县| 米脂县| 顺义区| 军事| 孝昌县| 自治县| 谷城县| 根河市| 九寨沟县| 太湖县| 宾川县| 克山县| 台江县| 永修县| 阆中市| 常德市| 蚌埠市| 彭泽县| 景洪市| 民县| 英德市|