lib 和 dll 的區別 生成以及使用詳解

2021-09-01 11:31:20 字數 3288 閱讀 3803

首先介紹一下靜態庫(靜態鏈結庫)、動態庫(動態鏈結庫)的概念,首先兩者都是**共享的方式。

靜態庫:在鏈結步驟中,聯結器將從庫檔案取得所需的**,複製到生成的可執行檔案中,這種庫稱為靜態庫,其特點是可執行檔案中包含了庫**的乙份完整拷貝;缺點就是被多次使用就會有多份冗餘拷貝。即靜態庫中的指令都全部被直接包含在最終生成的 exe 檔案中了。在vs中新建生成靜態庫的工程,編譯生成成功後,只產生乙個.lib檔案

動態庫:動態鏈結庫是乙個包含可由多個程式同時使用的**和資料的庫,dll不是可執行檔案。動態鏈結提供了一種方法,使程序可以呼叫不屬於其可執行**的函式。函式的可執行**位於乙個 dll 中,該 dll 包含乙個或多個已被編譯、鏈結並與使用它們的程序分開儲存的函式。在vs中新建生成動態庫的工程,編譯成功後,產生乙個.lib檔案和乙個.dll檔案

那麼上述靜態庫和動態庫中的lib有什麼區別呢?

靜態庫中的lib:該lib包含函式**本身(即包括函式的索引,也包括實現),在編譯時直接將**加入程式當中

動態庫中的lib:該lib包含了函式所在的dll檔案和檔案中函式位置的資訊(索引),函式實現**由執行時載入在程序空間中的dll提供

總之,lib是編譯時用到的,dll是執行時用到的。如果要完成源**的編譯,只需要lib;如果要使動態鏈結的程式執行起來,只需要dll

以下例子均在vs2010上測試

生成和使用動態庫

生成動態庫

可以看到生成了乙個dllmain.cpp 檔案,這是dll應用程式的入口,注意它和普通工程的入口main函式不同,這個檔案我們不需要修改。

在這個動態庫中我們舉例匯出乙個變數,乙個類,乙個函式,標頭檔案dll.h如下:

1 //新建生成dll的工程時,vs預設定義了巨集dll_export,因此,dll_api 是 __declspec(dllexport),用來匯出

2 //當我們在靜態呼叫dll時,我們包含該標頭檔案,由於沒有定義dll_export,所以dll_api是

3 //__declspec(dllimport),用來匯入

4 #ifdef dll_exports

5 #define dll_api __declspec(dllexport)

6 #else

7 #define dll_api __declspec(dllimport)

8 #endif

9 10 // 匯出類

11 class dll_api cdll ;

16 17 //匯出變數,變數在.cpp檔案中定義

18 extern dll_api int ndll;

19 20 //匯出函式,加extern "c",是為了保證編譯時生成的函式名不變,這樣動態呼叫dll時才能

21 //正確獲取函式的位址

22 extern "c" dll_api int fndll(void);

dll.cpp 檔案如下:

1 #include "dll.h"

2 3

4 // 這是匯出變數的乙個示例

5 dll_api int ndll=6;

6 7 // 這是匯出函式的乙個示例。

8 dll_api int fndll(void)

9 12

13 // 這是已匯出類的建構函式。

14 // 有關類定義的資訊,請參閱 dll.h

15 cdll::cdll()

16

呼叫動態庫

有兩種方法呼叫動態庫,一種隱式鏈結,一種顯示鏈結。

隱式鏈結 需要.h檔案,dll檔案,lib檔案

(1)將dll放到工程的工作目錄

(2)設定專案屬性--vc++目錄--庫目錄為lib所在的路徑

(4)在原始檔中新增.h標頭檔案

然後就像平常一樣呼叫普通函式、類、變數

顯示鏈結 只需要.dll檔案,但是這種呼叫方式不能呼叫dll中的變數或者類(其實可以呼叫類,但是相當麻煩,有興趣者可參考

顯示呼叫主要使用win32 api函式loadlibrary、getprocaddress,舉例如下:

1 typedef int (*dllfun)(void);//定義指向dll中函式的函式指標

2 hinstance hlib = loadlibrary(".\\dll.dll");

3 if(!hlib)

4

8 dllfun fun = (dllfun)getprocaddress(hlib,"fndll");

9 if(!fun)

10

14 fun();

生成和使用靜態庫

生成靜態庫

靜態庫專案沒有main函式,也沒有像dll專案中的dllmain。

建立專案後新增.h檔案,新增相應的匯出函式、變數或類,如下所示

1 #ifndef _mylib_h_

2 #define _mylib_h_

3 4 void fun(int a);

5 6 extern int k;

7 8 class testclass

9 ;14 15 #endif

.cpp檔案如下

1 #include "stdafx.h"

2 #include "lib.h"

3 #include 4

5 void fun(int a)

6 {7 std::cout<

編譯工程後就會生成乙個.lib檔案

使用靜態庫

需要.h檔案,lib檔案

(1)設定專案屬性--vc++目錄--庫目錄為lib所在的路徑

(3)在原始檔中新增.h標頭檔案

然後就像平常一樣呼叫普通函式、類、變數,舉例如下:

1 #include 2 #include "lib.h"

3 4 #pragma comment(lib, "lib.lib")

5 6 int main()

7 {8 fun(4);

9 std::cout<

lib和dll的區別,生成

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

lib和dll的區別 生成以及使用詳解

目錄 lib dll介紹 生成動態庫 呼叫動態庫 生成靜態庫 呼叫靜態庫 首先介紹一下靜態庫 靜態鏈結庫 動態庫 動態鏈結庫 的概念,首先兩者都是 共享的方式。靜態庫 在連線步驟中,聯結器將從庫檔案取得所需的 複製到生成的可執行檔案中,這種苦稱為靜態庫,其特點是可執行檔案中包含了庫 的乙份完整拷貝 ...

lib 和 dll 的區別 生成以及使用詳解

lib 和 dll 的區別 生成以及使用詳解 目錄 lib dll介紹 生成動態庫 呼叫動態庫 生成靜態庫 呼叫靜態庫 首先介紹一下靜態庫 靜態鏈結庫 動態庫 動態鏈結庫 的概念,首先兩者都是 共享的方式。靜態庫 在鏈結步驟中,聯結器將從庫檔案取得所需的 複製到生成的可執行檔案中,這種庫稱為靜態庫,...