動態鏈結庫(dll)與靜態連線庫(lib)

2021-10-07 07:21:01 字數 2973 閱讀 9782

一、前言

dll(dynamic)動態鏈結庫,包含多個程式執行的**和資料,程式執行時是需要使用dll;

lib(static)靜態鏈結庫,包含dll中各函式的入口資訊,在程式編譯時用到;

動態連線庫可以使設計者隱藏函式的具體實現,便噶增加**的復用性;

動態鏈結庫參與的程式中,lib檔案和dll檔案都要用到。

二、dll的生成

標頭檔案中增加下面幾行**

#pragma once

#ifdef ***x_exports //如果定義了***x_exports 變數

#define dll_api __declspec(dllexport) //那麼定義dll_api為__declspec(dllexport)的別名

#else //若梅定義

#define dll_api __declspec(dllimport) //定義dll_api欄位為匯入

#endif

__declspec(dllexport)為匯出標誌;若要將某個類匯出:

class dll_api 類名
若要將某個函式匯出:

extern "c" 返回值型別 dll_api 函式名(引數1,引數2,...)
extern "c"表示在其他類中已經定義了該**裡內容,這裡只是宣告,「c」表明按照c語言方式進行編譯和鏈結,因為c++編譯時會對函式名進行修飾,用於實現函式的過載,而c裡面沒有這個功能,多以需要用extern 「c」在而檔案頭宣告時加以區分,以便鏈結時進行正確的函式名查詢;

三、dll和lib的引用

屬性—>輸入—>附加依賴項,出入需要的***.lib檔案;

將lib檔案放到目標工程目錄下,確保該目錄是在屬性—>c++—>常規—>附加包含目錄中,若沒有,新增即可;

將dll檔案放到debug/release檔案下;

在工程檔案中太你家與lib名稱相同的標頭檔案,檔案最上方新增:

class __declspec(dllimport) ***.lib
若匯入函式:

extern "c" __declspec(dllimport) void 函式名(引數列表);
匯入動態連線庫可以也可以如下寫法:

#include "../dll/dll.h"   //通過相對路徑或絕對路徑新增標頭檔案

#pragma comment (lib,"../dll/dll1.lib") //新增庫檔案

四、例項

dllexample.h

#pragma once

#include #ifdef dll_exports

#define dll_api __declspec(dllexport)

#else

#define dll_api __declspec(dllimport)

#endif

class dll_api exportinte***ce};

extern "c" dll_api exportinte***ce* getinstance();

extern "c" dll_api void releaseinstance(exportinte***ce* pinstance);

#ifdef dll_exports //我們並不需要向外匯出該類的定義,在外部**編譯時,也不需要包含此類的定義。

class exportclass : public exportinte***ce

};#endif

dllexample.cpp:

#define dll_exports

#include "dlltest.h"

#include extern "c" dll_api exportinte***ce* getinstance()

extern "c" dll_api void releaseinstance(exportinte***ce* pinstance)

void exportclass::foo()

呼叫

#include #include #include "dlltest.h"

using namespace std;

// 動態載入dll

// 函式指標,用於獲取getprocaddress返回的函式位址,並呼叫dll中的函式

typedef exportinte***ce* (*dllgetinstance)(void);

typedef void (*dllreleaseinstance)(exportinte***ce*);

int main()

getinstance = (dllgetinstance)getprocaddress(hinstlibrary, "getinstance");

releaseinstance = (dllreleaseinstance)getprocaddress(hinstlibrary, "releaseinstance");

if (getinstance == null || releaseinstance == null)

ptest = getinstance();

ptest->foo();

releaseinstance(ptest);

std::cin.get();

freelibrary(hinstlibrary);

std::cin.get();

return 0;

}

具體參考:

動態鏈結庫dll,靜態鏈結庫lib, 導入庫lib

目前以lib字尾的庫有兩種,一種為靜態鏈結庫 static libary,以下簡稱 靜態庫 另一種為動態連線庫 dll,以下簡稱 動態庫 的導入庫 import libary,以下簡稱 導入庫 靜態庫是乙個或者多個obj檔案的打包,所以有人乾脆把從obj檔案生成lib的過程稱為archive,即合併...

動態鏈結庫dll,靜態鏈結庫lib, 導入庫lib

目前以lib字尾的庫有兩種,一種為靜態鏈結庫 static libary,以下簡稱 靜態庫 另一種為動態連線庫 dll,以下簡稱 動態庫 的導入庫 import libary,以下簡稱 導入庫 靜態庫是乙個或者多個obj檔案的打包,所以有人乾脆把從obj檔案生成lib的過程稱為archive,即合併...

動態鏈結庫dll,靜態鏈結庫lib, 導入庫lib

目前以lib字尾的庫有兩種,一種為靜態鏈結庫 static libary,以下簡稱 靜態庫 另一種為動態連線庫 dll,以下簡稱 動態庫 的導入庫 import libary,以下簡稱 導入庫 靜態庫是乙個或者多個obj檔案的打包,所以有人乾脆把從obj檔案生成lib的過程稱為archive,即合併...