靜態庫和動態庫的那點事

2021-06-11 20:42:07 字數 1900 閱讀 6508

(1)靜態庫

* 靜態庫是把程式執行時需要使用的函式編譯在乙個二進位制檔案中,擴充套件名為.lib。當程式link時把靜態庫中的二進位制資料和程式其它資料放到一起。程式執行時不在需要lib和dll檔案的支援。我們在鏈結的時候需要靜態鏈結庫,一旦鏈結成功,生成了可執行檔案,那麼,靜態鏈結庫就不再需要了。這樣做的壞處是開發出來的程式占用磁碟空間較大。

* 靜態庫為.lib檔案形式存在

* 鏈結後產生的可執行檔案包含了所有需要呼叫的函式的**,因此占用磁碟空間較大

* 如果有多個(呼叫相同庫函式的)程序在記憶體中間時執行,記憶體中就存有多份相同的庫函式**,因此占用記憶體空間較多。

(2)動態庫

* 動態庫在開發時僅是把dll中的函式名和引數放到應用程式中,應用程式執行時根據函式名和引數呼叫dll中的函式來執行,這樣作業系統中的應用程式可以同時使用同乙個dll。可以有效地節省硬碟空間,當然這樣做使得程式設計更有層次。也有利於軟體工程師的分工和資訊保安

* 動態庫以.dl檔案形式存在,且一般都有乙個對應的引入庫以.lib檔案形式存在。純資源dll不生成.lib引入庫。

>引入庫和靜態庫的副檔名均為*.lib,但是引入庫僅包含一些函式名和引數資訊,沒有函式體,是為呼叫動態庫服務的,它和動態庫的關係相當於.h檔案和.cpp檔案之間的關係;

* 動態庫兩種繫結方式

>靜態繫結(static blnding) 使用靜態繫結的程式在一開始載入記憶體的時候,引導程式就會把程式所有呼叫到的動態**的位址算出、確定下來。這種方式使程式剛執行時的初始化時間較長,不過一但完成動態裝載,程式的執行速度就很快。

2動態繫結(dynamic binding)   使用這種方式的程式並不在一開始就完成動態鏈結,而是直到真正呼叫動態庫**時,引導程式才計算(被呼叫的那部分)動態**的邏輯位址,然後等到某個時候,程式又需要呼叫另外某塊動態**時,引導程式才又去計算這部分**的邏輯位址。所以,這種方式侄程式初始化時間較短,但執行期間的效能比不上靜態繫結的程式。

* 使用動態庫的兩種方法(windows)

>方法一: load-time dynamic linking 

在要呼叫dll的應用程式鏈結時,將dll的輸入庫檔案(import library,.lib檔案)包含進去。具體的做 法是在原始檔開頭加一句#include ,然後就可以在原始檔中呼叫dlldemo.dll中的輸出檔案了。

>方法二: run-time dynamic linking 

不必在鏈結時包含輸入庫檔案,而是在源程式中使用loadlibrary或loadlibraryex動態的載入dll。

2兩個lib檔案

我們發現,無論是靜態鏈結庫還是動態鏈結庫,最後都有lib檔案,那麼兩者區別是什麼呢?其實,兩個是完全不一樣的東西。staticcai.lib的大小為4kb,dllcai.lib的大小為2kb,靜態庫對應的lib檔案叫靜態庫,動態庫對應的lib檔案叫導入庫。實際上靜態庫本身就包含了實際執行**、符號表等等,而對於導入庫而言,其實際的執行**位於動態庫中,導入庫只包含了位址符號表等,確保程式找到對應函式的一些基本位址資訊。

在dll編寫時,使用__declspec(dllexport)的作用,它就是為了省掉在def檔案中手工定義匯出哪些函式的乙個方法。當然,如果你的dll裡全是c++的類的話,你無法在def裡指定匯出的函式,只能用__declspec(dllexport)匯出類。但是,msdn文件裡面,對於__declspec(dllimport)的說明讓人感覺有點奇怪,先來看看msdn裡面是怎麼說的:

「不使用 __declspec(dllimport) 也能正確編譯**,但使用 __declspec(dllimport) 使編譯器可以生成更好的**。編譯器之所以能夠生成更好的**,是因為它可以確定函式是否存在於 dll 中,這使得編譯器可以生成跳過間接定址級別的**,而這些**通常會出現在跨 dll 邊界的函式呼叫中。但是,必須使用 __declspec(dllimport) 才能匯入 dll 中使用的變數」。

靜態庫與動態庫的那點事

靜態庫與動態庫的相關概念以及使用方法?要點 截圖展示區 訪問動態庫,hmodule mydll loadlibrarya 動態庫.dll include include include 匯出函式,載入時呼叫 declspec dllexport void msg 匯出函式,載入時呼叫 declspe...

庫(靜態庫和動態庫)

一 靜態庫 以c語言的形式生成庫 h中extern c int add int int extern c int sub int int 二.測試靜態庫 將.h和.lib放入 h ifdef cplusplus c 程式設計師用c的方式開啟 extern c int add int int exte...

靜態庫和動態庫

一。靜態庫 靜態庫的優點在於使用簡單,編譯快速。靜態庫在應用程式生成時,已經編譯成為可重定位的目標檔案,因此可以不必再編譯,節省編譯時間,以最短的時間生成可執行程式。步奏 a。建立靜態庫 1 在編輯器中編輯其靜態庫函式 static lib.c 2 在shell中編譯該原始檔,生成乙個可重定位的目標...