首先我們來說說靜態鏈結庫
靜態資料庫是指 lib 單獨使用, 在編譯時直接加入程式當中, 包含函式本身, 不僅包含標頭檔案,還有原始碼, 稱為靜態鏈結庫static link library。鏈結生成的程式可以獨立執行。
即lib檔案是靜態編譯出來的,索引和實現都在其中。
缺點是任何改動,都需要重新編譯、鏈結,這個對大型的程式非常不便,公升級也麻煩。有時,在更改資料結構時,需要重新編譯整個工程,而非只編譯、鏈結單個lib。
實現方法:
在 vc new 乙個名稱為 libtest 的 static link library 工程, 並新建 lib.cpp 和 lib.h 兩個檔案,
//lib.h
#ifndef lib_h
#define lib_h
extern"c
"int add(int x, int y); //
宣告為 c 編譯、連線方式的外部函式
#endif
//lib.cpp
#include 「lib.h」
int add(int x, int
y)
編譯這個工程就得到了乙個 .lib 檔案,這個檔案就是乙個函式庫, 他提供了 add 的功能, 將標頭檔案和 .lib 檔案提交給使用者後,使用者可以直接使用其中的 add 函式了。
下面來看看怎麼使用這個庫:
#include #include"lib.h
"#pragma comment(lib, "..\\debug\\libtest.lib") //
指定與靜態庫一起連線
intmain()
如果不用 #pragma comment 指定, 可以在設定->連線中新增 .lib 庫。
這個靜態鏈結庫讓大概我們了解庫是怎麼一回事,下面我們來看看動態鏈結庫
動態鏈結庫區別與靜態鏈結庫在於他是以 lib + dll 的方式實現,lib 包含了函式所在的dll檔案和檔案中函式位置的資訊(入口),**由執行時載入在程序空間中的 dll 提供,稱為動態鏈結庫 dynamic link library。生成的程式需要dll配合使用。
即 lib 一般是一些索引資訊,記錄了dll中函式的入口和位置,dll中是函式的具體內容。應用程式使用lib檔案鏈結到dll檔案。在應用程式的可執行檔案中,存放的不是被呼叫的函式**,而是dll中相應函式**的位址,從而節省了記憶體資源。
1.多個程式執行,共享乙份**。節省記憶體。
2. 當 dll 中的函式發生更改時,只要函式的引數和返回值沒有更改,就不需重新編譯或重新鏈結使用它們的應用程式。
實現方法:
在 vc 中 new 乙個 win32 dynamic-link library 工程 dlltest, 並在工程中新增 lib.h 和 lib.cpp 檔案,
//lib.h
#ifndef lib_h
#define lib_h
extern"c
"int __declspes(dllexport)add(int a, int
b);#endif
//lib.cpp
#iclude "
lib.h
"int add(int a, int
b)
下面看看如何使用這個動態鏈結庫,與靜態鏈結庫又有哪些不同。
#include #includetypedef
int(*lpaddfun)(int, int
);int
main()
freelibrary(hdll);
}return0;
}
分析上面的**, dlltest 工程中的 lib.cpp 檔案與之前的靜態鏈結庫完全相同, 不同在於 lib.h 對於函式 add 的宣告前面新增了 __declspes(dllexport) 語句,這個語句反的含義是宣告函式 add 為 dll 的函式。
而 dll 內的函式分為兩種:
1. dll 匯出函式, 可**用程式呼叫
2. dll 內部函式, 只能在 dll 程式使用, 應用程式無法呼叫他們
而應用程式對這個 dll 的呼叫和對靜態鏈結庫的呼叫卻有較大差異, 下面我們來逐一分析
首先,語句 typedef int(*lpaddfun)(int, int); 定義了乙個與 add 函式接受引數型別和返回值均相同的函式指標型別
隨後, 在 main 函式中定義了 lpaddfun 的例項 addfun
其次, 在 main 函式中定義了乙個 dll hinstance 控制代碼例項 hdll, 通過 win32 api 函式 loadlibrary 動態載入了 dll 模組並將 dll 模組控制代碼賦給了hdll
再次, 在函式 main 中通過 win32 api 函式 getprocaddress 得到了所載入 dll 模組中函式 add 的位址並賦給了 addfun,經由函式指標 addfun 進行了對 dll 中 add 函式的呼叫
最後, 應用程式使用完 dll 後, 在函式 main 中通過 win32 api 函式 freelibrary 釋放了已經載入的 dll 模組
這就是 dll 一些基本概念。
VC DLL 動態鏈結庫 四
dll 匯出類 dll 中定義的類可以在應用工程中使用。接下來,我將演示在 dll 中定義 point 和 circle 兩個類,並在應用工程中引用了他們。point.h point 類的宣告 ifnedf point h define point h ifdef dll file class de...
VC DLL 動態鏈結庫 三
dll 匯出變數 dll 定義的全域性變數可以被呼叫的程序訪問,dll 也可以訪問呼叫程序的全域性資料,我們來看看在應用工程中引用 dll 中的變數 lib.h ifnedef lib h define lib h extern intdllglobalvar endif lib.cpp inclu...
VC DLL 動態鏈結庫 二
dll 中匯出函式的宣告有兩種 1.在之前給出的在函式宣告中加上 declspec dllexport 在這就不再列舉了 2.採用模組定義 def 檔案宣告,def 檔案為聯結器提供了有關被連線程式的的匯出,屬性及其他方面的資訊 下面讓我們看看怎樣用 def 檔案將函式 add 宣告為 dll 匯出...