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

2021-08-30 17:32:04 字數 3232 閱讀 3930

【目錄】

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如下:

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

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

//__declspec(dllimport),用來匯入

#ifdef dll_exports

#define dll_api __declspec(dllexport)

#else

#define dll_api __declspec(dllimport)

#endif

//匯出類

class dll_api cdll ;

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

extern dll_api int ndll;

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

//正確獲取函式的位址

extern "c" dll_api int fndll(void);

dll.cpp檔案如下:

#include "dll.h"

//這是導演變數的乙個示例

dll_api int ndll=6;

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

dll_api int fndll(void)

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

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

cdll::cdll()

呼叫動態庫

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

呼叫動態庫:隱式鏈結

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

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

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

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

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

呼叫動態庫:顯示鏈結

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

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

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

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

if (!hlib)

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

if (!fun)

fun();

生成和使用靜態庫

生成靜態庫

新建專案--win32專案--填寫專案名--確定--下一步--應用程式型別:選擇靜態庫

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

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

#ifndef _mylib_h_

#define _mylib_h_

void fun(int a);

extern int k;

class testclass

;#endif

.cpp檔案如下:

#include "stdafx.h"

#include "lib.h"

#include void fun(int a)

{ std::cout《編譯工程後就會生成乙個.lib檔案

使用靜態庫

需要.h檔案,lib檔案

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

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

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

#include #include "lib.h"

#pargma comment(lib, "lib.lib")

int main()

{ fun(4);

std::cout<

lib和dll的區別,生成

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

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

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

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

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