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

2021-09-06 11:04:50 字數 3543 閱讀 4194

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

【目錄】

lib dll介紹

生成動態庫

呼叫動態庫

生成靜態庫

呼叫靜態庫

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

靜態庫:在鏈結步驟中,聯結器將從庫檔案取得所需的**,複製到生成的可執行檔案中,這種庫稱為靜態庫,其特點是可執行檔案中包含了庫**的乙份完整拷貝;缺點就是被多次使用就會有多份冗餘拷貝。即靜態庫中的指令都全部被直接包含在最終生成的 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#endif910

//匯出類

11class

dll_api cdll ;

1617

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

18extern dll_api int

ndll;

1920

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

21//

正確獲取函式的位址

22extern"c

" dll_api int fndll(void);

dll.cpp 檔案如下:

1 #include "

dll.h"2

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

5 dll_api int ndll=6;6

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

8 dll_api int fndll(void)9

1213

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

14//

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

15cdll::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");

3if(!hlib)

48 dllfun fun = (dllfun)getprocaddress(hlib,"

fndll");

9if(!fun)

1014 fun();

生成和使用靜態庫

生成靜態庫

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

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

1

#ifndef _mylib_h_

2#define _mylib_h_34

void fun(int

a);5

6extern

intk;78

class

testclass9;

1415

#endif

.cpp檔案如下

1 #include "

stdafx.h

"2 #include "

lib.h

"3 #include 4

5void fun(inta)6

910int k = 222;11

12testclass::testclass()

1316

17void

testclass::print()

18

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

使用靜態庫

需要.h檔案,lib檔案

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

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

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

1 #include 2 #include "

lib.h"3

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

intmain()

7

lib和dll的區別,生成

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

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

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

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

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