動態鏈結庫 靜態庫 import庫區別

2021-07-11 09:29:04 字數 2119 閱讀 8183

動態鏈結庫、靜態庫、import庫區別

windows為應用程式提供了豐富的函式呼叫,這些函式呼叫都包含在動態鏈結庫中。其中有3個最重要的dll。

kernel32.dll,它包含用於管理記憶體、程序和執行緒的各個函式;

user32.dll,它包含用於執行使用者介面任務(如視窗的建立和訊息的傳送)的各個函式;

gdi32.dll,它包含用於畫圖和顯示文字的各個函式。

靜態庫(static library):

函式和資料被編譯進乙個二進位制檔案(通常擴充套件名為.lib)。在使用靜態庫的情況下,在編譯鏈結可執行檔案時,

鏈結器從庫中複製這些函式和資料並把它們和應用程式的其它模組組合起來建立最終的可執行檔案(.exe檔案)。

導入庫(import library):

在使用動態鏈結庫的時候,往往提供兩個檔案:乙個引入庫和乙個dll。引入庫包含被dll匯出的函式和變數的符號名,dll包含實際的函式和資料。

在編譯鏈結可執行檔案時,只需要鏈結引入庫,dll中的函式**和資料並不複製到可執行檔案中,在執行的時候,再去載入dll,訪問dll中匯出的函式。

在執行windows程式時,它通過乙個被稱作「動態鏈結」的程序與windows相接。乙個windows的.exe檔案擁有它使用不同動態鏈結庫的引用,所使用的函式即在那裡。

當windows程式被載入到記憶體中時,程式中的呼叫被指向dll函式的入口,如果dll不在記憶體中,系統就將其載入到記憶體中。

當鏈結windows程式以產生乙個可執行檔案時,你必須鏈結由程式設計環境提供的專門的「導入庫(import library)庫」。

這些導入庫包含了動態鏈結庫名稱和所有windows函式呼叫的引用資訊。鏈結程式使用該資訊在.exe檔案中構造乙個表,當引導程式時,windows使用它將呼叫轉換為windows函式。

靜態庫與導入庫的區別:

導入庫和靜態庫的區別很大,他們實質是不一樣的東西。靜態庫本身就包含了實際執行**、符號表等等,

而對於導入庫而言,

其實際的執行**位於動態庫中,導入庫只包含了位址符號表等,確保程式找到對應函式的一些基本位址資訊。

靜態鏈結方法:#pragma comment(lib, "test.lib") ,靜態鏈結的時候,載入**就會把程式會用到的動態**或動態**的位址確定下來,

靜態庫的鏈結可以使用靜態鏈結,動態鏈結庫也可以使用這種方法鏈結導入庫。

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

在軟體開發的過程中,大家經常會或多或少的使用別人編寫的或者系統提供的動態庫或靜態庫,但是究竟是使用靜態庫還是動態庫呢?他們的適用條件是什麼呢?

簡單的說,靜態庫和應用程式編譯在一起,在任何情況下都能執行,而動態庫是動態鏈結,顧名思義就是在應用程式啟動的時候才會鏈結,所以,當使用者的系統上沒有該動態庫時,應用程式就會執行失敗。再看它們的特點:

動態庫:

1.共享:多個應用程式可以使用同乙個動態庫,啟動多個應用程式的時候,只需要將動態庫載入到記憶體一次即可;

2.開發模組好:要求設計者對功能劃分的比較好。

靜態庫:**的裝載速度快,執行速度也比較快,因為編譯時它只會把你需要的那部分鏈結進去,應用程式相對比較大。但是如果多個應用程式使用的話,會被裝載多次,浪費記憶體。

總上,我個人認為,如果你的系統上有多個應用程式都使用該庫的話,就把它編譯成動態庫,這樣雖然剛啟動的時候載入比較慢,但是多工的時候會比較節省記憶體;

如果你的系統上只有一到兩個應用使用該庫,並且使用的api比較少的話,就編譯成靜態庫吧,一般的靜態庫還可以進行裁剪編譯,這樣應用程式可能會比較大,但是啟動的速度會大大提高。

1.共享:多個應用程式可以使用同乙個動態庫,啟動多個應用程式的時候,只需要將動態庫載入到記憶體一次即可;

2.開發模組好:要求設計者對功能劃分的比較好。

動態鏈結庫 靜態鏈結庫

包含標頭檔案和庫 idir 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例 gcc test.c i.inc o test。ldir 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。llibrary 指定額外鏈結的lib庫 巨集定義 dmacro 以字串 1 預設值 定義 macro...

靜態鏈結庫 動態鏈結庫

庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll ...

靜態鏈結庫,動態鏈結庫

關於靜態鏈結庫,參考如下博文 當你完成了 開發,想把這個 給別人用,但是又不希望別人看到原始碼,就要給別人乙個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。或者過程相反,你從別人那裡拿到乙個庫和標頭檔案來使用。那麼如何編譯生成乙個庫給他人,如何使用從他人那裡拿到的庫呢?範例1 我們想把linuxfr...