Windows靜態庫和動態庫區別

2021-08-19 10:49:19 字數 1861 閱讀 5508

個人建議:能使用靜態庫的就不要使用動態庫,能使用隱式呼叫的就不要用顯示呼叫。

注意:(1)動態庫中的.lib檔案叫做導入庫,對於導入庫而言,其實際的執行**位於動態庫中,導入庫只包含了位址符號表等,確保程式找到對應函式的一些基本位址資訊。

靜態庫中的.lib叫做靜態庫,本身就包含了實際執行**、符號表等等

(2)顯示呼叫一定要用extern 「c」 變為c標準編譯,可杜絕c++的過載

靜態庫:在鏈結階段將彙編生成的目標檔案.o與引用庫一起鏈結打包到可執行檔案中,可簡單看成(.o或者.obj檔案的集合)。(1)對函式庫的鏈結是放在編譯時期完成的(2)程式在執行時與函式庫沒有瓜葛,移植方便(3)浪費空間和資源

靜態庫的建立:建立win32專案-》lib-》新增c++類-》新增函式

static double add(double a,double b);

呼叫:(1)若為第三方庫-》vc++目錄-》包含目錄,庫目錄

(2)若在同乙個工程中-》通用屬性-》框架和引用-》新增新引用

動態庫:

(1)將庫函式的鏈結載入推遲到程式執行時期

(2)可以實現程序間的資源共享(因此也稱為共享庫)

(3)將一些程式公升級變得簡單

(4)可以真正的做到鏈結載入完全由程式設計師在程式**中控制(顯示呼叫)

動態庫的建立:(1)和靜態庫一樣,然後屬性-》配置屬性-》常規-》配置型別

(2)win32工程-》dll

windows系統下的執行檔案格式是pe格式,動態庫需要乙個dllmain函式做初始化入口,通常用__declspecl(dllexport)關鍵字

static __declspec(dllexport) double add(double a,double b);

呼叫:(1)若為第三方庫-》vc++目錄-》包含目錄,庫目錄

dll考入到當前工作目錄下

(2)若在同乙個工程中-》通用屬性-》框架和引用-》新增新引用

(3)顯示呼叫若非類中函式-》vc++目錄-》包含目錄.h

.cpp中新增標頭檔案typedef double (*add)(double,double)函式申明

hinstance stance = loadlibrarya("../../dll/staticclassdll.dll")動態載入dll

add add = (add)getprocaddress(stance,"adddllglobal")獲取函式

double c = add(10,10)使用函式

freelibrary(stance)釋放控制代碼

(4)顯示呼叫若為類函式涉及到過載,則需要通過dll分析器進行名字粉碎從而和(3)中相同呼叫即可

addm addm = (addm)getprocaddress(stance,"?addxian@cxianshidll@@qaennn@z");

example:

動態:#ifdef xianshidll_exports

#define xianshidll_api __declspec(dllexport)         //為了書寫方便

#else

#define xianshidll_api __declspec(dllimport)

#endif

// 此類是從 xianshidll.dll 匯出的

extern "c" class xianshidll_api cxianshidll ;

extern xianshidll_api int nxianshidll;              //匯出變數的介面

xianshidll_api int fnxianshidll(void);               //類外函式可直接進行顯示呼叫

分類: 

c++標籤: , , 

Linux靜態庫和動態庫區別

我們通常把一些公用函式製作成函式庫,供其它程式使用。函式庫分為靜態庫和動態庫兩種。靜態庫在程式編譯時會被連線到目標 中,程式執行時將不再需要該靜態庫。動態庫在程式編譯時並不會被連線到目標 中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。本文主要通過舉例來說明在linux中如何建立靜態...

動態鏈結庫 靜態庫 import庫區別

動態鏈結庫 靜態庫 import庫區別 windows為應用程式提供了豐富的函式呼叫,這些函式呼叫都包含在動態鏈結庫中。其中有3個最重要的dll。kernel32.dll,它包含用於管理記憶體 程序和執行緒的各個函式 user32.dll,它包含用於執行使用者介面任務 如視窗的建立和訊息的傳送 的各...

WINDOWS靜態庫與動態庫

編譯靜態庫時,只會產生.lib檔案。所有資料都在lib檔案中。靜態庫的使用方式只有一種,即靜態載入,在程式編譯鏈結階段,會將靜態庫中的所有資料都鏈結合併到最終生成的exe檔案中,鏈結完成後就不再需要靜態庫檔案,這樣方便程式移植,但是也帶來程式臃腫過大的弊端。同時,如果靜態庫中函式有所變化,需要重新編...