靜態鏈結庫和動態鏈結庫

2021-04-29 00:58:54 字數 2281 閱讀 4701

靜態鏈結庫

win32 static library

呼叫libtest.lib:

動態dll

win32 dynamic-link library

**跟librest的生成是一樣的

動態呼叫:

成的.lib 和.dll 檔案拷入dllcall 工程所在的路徑,dllcall 執行下列**:

dll  中匯出函式的宣告有兩種方式:一種為在函式宣告中加上__declspec(dllexport),這裡不再舉例說明;另外一種方式是採用模組定義(.def)檔案宣告,.def 檔案為鏈結器提供了有關被鏈結程式的匯出、屬性及其他方面的資訊。

下面的**演示了怎樣同.def 檔案將函式add 宣告為dll 匯出函式(需在dlltest 工程

中新增lib.def 檔案):

; lib.def :  匯出dll 函式

library dlltest

exports

add @ 1

.def 檔案的規則為:

(1)library 語句說明.def 檔案相應的dll;

(2)exports 語句後列出要匯出函式的名稱。可以在.def 檔案中的匯出函式名後加@n,

表示要匯出函式的序號為n            (在進行函式呼叫時,這個序號將發揮其作用);

(3).def 檔案中的注釋由每個注釋行開始處的分號 (;)               指定,且注釋不能與語句共享一

行。 由此可以看出,例子中lib.def 檔案的含義為生成名為「dlltest」的動態鏈結庫,匯出其

中的add 函式,並指定add 函式的序號為1。

帶dllmain的dll:

windows 在載入dll 的時候,需要乙個入口函式,就如同控制台或dos 程式需要main

函式、win32 程式需要winmain 函式一樣。在前面的例子中,dll 並沒有提供dllmain 函

數,應用工程也能成功引用dll,這是因為windows 在找不到dllmain  的時候,系統會從

其它執行庫中引入乙個不做任何操作的預設dllmain  函式版本,並不意味著dll 可以放棄

dllmain 函式。

根據編寫規範,windows 必須查詢並執行dll 裡的dllmain 函式作為載入dll 的依據,

它使得dll 得以保留在記憶體裡。這個函式並不屬於匯出函式,而是dll 的內部函式。這意

味著不能直接在應用工程中引用dllmain 函式,dllmain 是自動被呼叫的。

呼叫就跟其他dll呼叫是一樣的!

如果通過vc++編寫的dll  欲被其他語言編寫的程式呼叫,應將函式的呼叫方式宣告

為__stdcall 方式,winapi 都採用這種方式,而c/c++預設的呼叫方式卻為__cdecl 。__stdcall

方式與__cdecl 對函式名最終生成符號的方式不同。若採用c 編譯方式(在c++中需將函式聲

明為extern "c"),__stdcall 呼叫約定在輸出函式名前面加下劃線,後面加「@」符號和引數

的位元組數,形如_functionname@number ;而__cdecl 呼叫約定僅在輸出函式名前面加下劃線,

形如_functionname 。

windows 程式設計中常見的幾種函式型別宣告巨集都是與__stdcall  和__cdecl  有關的(節選自

windef.h ):

#define callback __stdcall //這就是傳說中的**函式

#define winapi __stdcall //這就是傳說中的winapi

#define winapiv __cdecl

#define apientry winapi //dllmain 的入口就在這裡

#define apiprivate __stdcall

#define pascal __stdcall

在lib.h 中,應這樣宣告add 函式:

int __stdcall add(int x, int y);

在應用工程中函式指標型別應定義為:

typedef int(__stdcall *lpaddfun)(int, int);

若在 lib.h   中將函式宣告為__stdcall          呼叫,而應用工程中仍使用 typedef                  int  (*

lpaddfun)(int,int),執行時將發生錯誤(因為型別不匹配,在應用工程中仍然是預設的__cdecl

呼叫),彈出錯誤對話方塊。

靜態鏈結庫和動態鏈結庫

其實再vc中,我們所用得所有api函式都封裝再下列三個dll檔案中 kernel32.dll 用於管理記憶體,程序和執行緒得各個函式 user32.dll 用於執行使用者介面任務,如視窗的建立和訊息的傳遞的各個函式 gdi32.dll 用於顯示文字和畫圖的各個函式 動態鏈結庫 我們再使用動態庫的時候...

靜態鏈結庫和動態鏈結庫

以前的時候寫過這方面的部落格,當時寫的時候都覺得已經懂了。今天閒著沒事幹,和咚哥他們去大華校招筆試遇到了這個問題。我突然間發現sdk沒寫三個月,把dll都忘記了。回來看了下,複習下。以前寫過程式的裝載和鏈結的部落格,那是os上面比較理論的。實際用函式庫的時候主要分為,靜態庫和動態庫,這裡就簡簡單單地...

靜態鏈結庫和動態鏈結庫

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