個人建議:能使用靜態庫的就不要使用動態庫,能使用隱式呼叫的就不要用顯示呼叫。
注意:(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檔案中,鏈結完成後就不再需要靜態庫檔案,這樣方便程式移植,但是也帶來程式臃腫過大的弊端。同時,如果靜態庫中函式有所變化,需要重新編...