lib和dll的區別

2021-05-04 05:31:05 字數 3229 閱讀 6487

(1)lib是編譯時需要的,dll是執行時需要的。

如果要完成源**的編譯,有lib就夠了。

如果也使動態連線的程式執行起來,有dll就夠了。

在開發和除錯階段,當然最好都有。

(2) 一般的動態庫程式有lib檔案和dll檔案。lib檔案是必須在編譯期就連線到應用程式中的,而dll檔案是執行期才會被呼叫的。如果有dll檔案,那麼對應的lib檔案一般是一些索引資訊,具體的實現在dll檔案中。如果只有lib檔案,那麼這個lib檔案是靜態編譯出來的,索引和實現都在其中。靜態編譯的lib檔案有好處:給使用者安裝時就不需要再掛動態庫了。但也有缺點,就是導致應用程式比較大,而且失去了動態庫的靈活性,在版本公升級時,同時要發布新的應用程式才行。

(3)在動態庫的情況下,有兩個檔案,乙個是引入庫(.lib)檔案,乙個是dll檔案,引入庫檔案包含被dll匯出的函式的名稱和位置,dll包含實際的函式和資料,應用程式使用lib檔案鏈結到所需要使用的dll檔案,庫中的函式和資料並不複製到可執行檔案中,因此在應用程式的可執行檔案中,存放的不是被呼叫的函式**,而是dll中所要呼叫的函式的記憶體位址,這樣當乙個或多個應用程式執行是再把程式**和被呼叫的函式**鏈結起來,從而節省了記憶體資源。從上面的說明可以看出,dll和.lib檔案必須隨應用程式一起發行,否則應用程式將會產生錯誤。

(以下是另外一篇文章的內容)

1、引言

動態庫(dynamic link library abbr,dll)技術是程式設計中經常採用的技術。其目的減少程式的大小,節省空間,提高效率,具有很高的靈活性。採用動態庫技術對於公升級軟體版本更加容易。與靜態庫(static link library)不同,動態庫裡面的函式不是執行程式本身的一部分,而是根據執行需要按需載入,其執行**可以同時在多個程式中共享。

在windows和linux作業系統中,都可採用這種方式進行軟體設計,但他們的呼叫方式以及程式編制方式不盡相同。本文首先分析了在這兩種作業系統中通常採用的動態庫呼叫方法以及程式編制方式,然後分析比較了這兩種方式的不同之處,最後根據實際移植程式經驗,介紹了將vc++編制的windows動態庫移植到linux下的方法。

2、動態庫技術

2.1 windows動態庫技術

動態鏈結庫是實現windows應用程式共享資源、節省記憶體空間、提高使用效率的乙個重要技術手段。常見的動態庫包含外部函式和資源,也有一些動態庫只包含資源,如windows字型資源檔案,稱之為資源動態鏈結庫。通常動態庫以.dll,.drv、.fon等作為字尾。相應的windows靜態庫通常以.lib結尾,windows自己就將一些主要的系統功能以動態庫模組的形式實現。

windows動態庫在執行時被系統載入到程序的虛擬空間中,使用從呼叫程序的虛擬位址空間分配的記憶體,成為呼叫程序的一部分。dll也只能被該程序的執行緒所訪問。dll的控制代碼可以被呼叫程序使用;呼叫程序的控制代碼可以被dll使用。dll模組中包含各種匯出函式,用於向外界提供服務。dll可以有自己的資料段,但沒有自己的堆疊,使用與呼叫它的應用程式相同的堆疊模式;乙個dll在記憶體中只有乙個例項;dll實現了**封裝性;dll的編制與具體的程式語言及編譯器無關,可以通過dll來實現混合語言程式設計。dll函式中的**所建立的任何物件(包括變數)都歸呼叫它的執行緒或程序所有。

根據呼叫方式的不同,對動態庫的呼叫可分為靜態呼叫方式和動態呼叫方式。

(1)靜態呼叫,也稱為隱式呼叫,由編譯系統完成對dll的載入和應用程式結束時dll解除安裝的編碼(windows系統負責對dll呼叫次數的計數),呼叫方式簡單,能夠滿足通常的要求。通常採用的呼叫方式是把產生動態連線庫時產生的.lib檔案加入到應用程式的工程中,想使用dll中的函式時,只須在原始檔中宣告一下。 lib檔案包含了每乙個dll匯出函式的符號名和可選擇的標識號以及dll檔名,不含有實際的**。lib檔案包含的資訊進入到生成的應用程式中,被呼叫的dll檔案會在應用程式載入時同時載入在到記憶體中。

(2)動態呼叫,即顯式呼叫方式,是由程式設計者用api函式載入和解除安裝dll來達到呼叫dll的目的,比較複雜,但能更加有效地使用記憶體,是編制大型應用程式時的重要方式。在windows系統中,與動態庫呼叫有關的函式包括:

①loadlibrary(或mfc 的afxloadlibrary),裝載動態庫。

②getprocaddress,獲取要引入的函式,將符號名或標識號轉換為dll內部位址。

③freelibrary(或mfc的afxfreelibrary),釋放動態鏈結庫。

在windows中建立動態庫也非常方便和簡單。在visual c++中,可以建立不用mfc而直接用c語言寫的dll程式,也可以建立基於mfc類庫的dll程式。每乙個dll必須有乙個入口點,在vc++中, dllmain是乙個預設的入口函式。dllmain負責初始化(initialization)和結束(termination)工作。動態庫輸出函式也有兩種約定,分別是基於呼叫約定和名字修飾約定。dll程式定義的函式分為內部函式和匯出函式,動態庫匯出的函式供其它程式模組呼叫。通常可以有下面幾種方法匯出函式:

①採用模組定義檔案的export部分指定要輸入的函式或者變數。

②使用mfc提供的修飾符號_declspec(dllexport)。

③以命令列方式,採用/export命令列輸出有關函式。

在windows動態庫中,有時需要編寫模組定義檔案(.def),它是用於描述dll屬性的模組語句組成的文字檔案。

3、兩種系統動態庫比較分析

windows和linux採用動態鏈結庫技術目的是基本一致的,但由於作業系統的不同,他們在許多方面還是不盡相同,下面從以下幾個方面進行闡述。

(1)動態庫程式編寫,在windows系統下的執行檔案格式是pe格式,動態庫需要乙個dllmain函式作為初始化的人口,通常在匯出函式的宣告時需要有_declspec(dllexport)關鍵字。linux下的gcc編譯的執行檔案預設是elf格式,不需要初始化入口,亦不需要到函式做特別宣告,編寫比較方便。

(2)動態庫編譯,在windows系統下面,有方便的除錯編譯環境,通常不用自己去編寫makefile檔案,但在linux下面,需要自己動手去編寫makefile檔案,因此,必須掌握一定的makefile編寫技巧,另外,通常linux編譯規則相對嚴格。

(3)動態庫呼叫方面,windows和linux對其下編制的動態庫都可以採用顯式呼叫或隱式呼叫,但具體的呼叫方式也不盡相同。

(4)動態庫輸出函式檢視,在windows中,有許多任務具和軟體可以進行檢視dll中所輸出的函式,例如命令列方式的dumpbin以及vc++工具中的depends程式。在linux系統中通常採用nm來檢視輸出函式,也可以使用ldd檢視程式隱式鏈結的共享物件檔案。

(5)對作業系統的依賴,這兩種動態庫執行依賴於各自的作業系統,不能跨平台使用。因此,對於實現相同功能的動態庫,必須為兩種不同的作業系統提供不同的動態庫版本。

lib和dll的區別

關於lib和dll的區別如下 1 lib是編譯時用到的,dll是執行時用到的。如果要完成源 的編譯,只需要lib 如果要使動態鏈結的程式執行起來,只需要dll。2 如果有dll檔案,那麼lib一般是一些索引資訊,記錄了dll中函式的入口和位置,dll中是函式的具體內容 如果只有lib檔案,那麼這個l...

lib 和 dll 的區別

首先介紹一下靜態庫 靜態鏈結庫 動態庫 動態鏈結庫 的概念,首先兩者都是 共享的方式。靜態庫 在鏈結步驟中,聯結器將從庫檔案取得所需的 複製到生成的可執行檔案中,這種庫稱為靜態庫,其特點是可執行檔案中包含了庫 的乙份完整拷貝 缺點就是被多次使用就會有多份冗餘拷貝。即靜態庫中的指令都全部被直接包含在最...

lib和 dll的區別和使用

共有兩種庫 1.一種是lib包含了函式所在的dll檔案和檔案中函式位置的資訊 入口 由執行時載入在程序空間中的dll提供,稱為動態鏈結庫dynamic link library。2.一種是lib包含函式 本身,在編譯時直接將 加入程式當中,稱為靜態鏈結庫static link library。1.動...