一、前言
dll(dynamic)動態鏈結庫,包含多個程式執行的**和資料,程式執行時是需要使用dll;
lib(static)靜態鏈結庫,包含dll中各函式的入口資訊,在程式編譯時用到;
動態連線庫可以使設計者隱藏函式的具體實現,便噶增加**的復用性;
動態鏈結庫參與的程式中,lib檔案和dll檔案都要用到。
二、dll的生成
標頭檔案中增加下面幾行**
__declspec(dllexport)為匯出標誌;若要將某個類匯出:#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
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
dllexample.cpp:#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
呼叫#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,即合併...