一個語言的活力,在於庫的豐富與否!
動態,靜態庫的發布和使用。這裡給大家一個簡單解釋!要真正理解,得動手試試啊。
動態指的是隨時用隨時調用,並沒有載入到可執行程式裡面,而是獲得一個函數或者變數的地址。用的時候去沿著地址取。
靜態指的是不管你用不用都放那裡。用你就用。不用也放那裡。
1.動態連結程式庫:動態顧名思義,是在程式運行時候用到哪裡調入那裡的方式。
對於動態庫的應用(在windows上)主要兩種方式。
1.1自動匯入。
首先,我們來發布一個dll庫,過程:VS 建立項目----->win32控制台------->dll (過程簡單就不了)
這時候,你需要的是如何發布dll以及如何這裡有一種發布dll的方法:(實現加減乘除)
標頭檔:Mydll.h
extern "C"_declspec(dllexport)int add(int i,int j);extern "C"_declspec(dllexport)int sub(int i,int j);extern "C"_declspec(dllexport)int mull(int i,int j);extern "C"_declspec(dllexport)float divv(int i,int j);
複製代碼
cpp檔案:Mydll.cpp
// jisuan.cpp: implementation of the jisuan class.//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////#include "jisuan.h"int add(int i,int j){ return i + j;}int sub(int i,int j){ return i - j;}int mull(int i,int j){ return i * j;}float divv(int i,int j){ return i/(float)j;}
點擊產生,在debug檔案下就有了一些東西 主要用的是 dll 和lib檔案。
這裡先解釋一下,這兩個檔案的作用。dll就是動態連結程式庫,裡面主要儲存了所需要的函數以及資料。而lib檔案呢?是動態庫的引導庫。在第二種方法:手動添加的時候使用不到它的。這裡自動方法,用引導庫自動在發布程式過程中將動態庫裡面的函數地址用引導庫直接靜態放到可執行檔裡。
好的,接下來是動態庫的編譯與運行了。為什麼要分著說呢?因為他們確實在分管著不同的時刻。在編譯時間是不需要動態庫的,當然在運行時是不需要引導庫的。 所以,你要知道即便靜態庫也是lib 他們本質上是不一樣的(雖然作用都是靜態發布到可執行程式中)。
接下來,我們簡單建立一個win32控制台程式。
首先,我們需要編譯時間候將dll中的函數地址在編譯時間候放到可執行程式中。
所以設定項目屬性(項目--->右鍵--->屬性)
C++常規中 附加元件封裝含目錄中添加上你那個Mydll.h的地址。
連結器---->常規----->附加庫目錄:你得Myddl.lib 的目錄位址
輸入----->附加依賴項 : Mydll.lib
ok,這個時候就可以像用 iostream 中的 cout一樣用 你在Mydll中函數了
比如:
1 #include "stdafx.h"2 #include "jisuan.h"3 int _tmain(int argc, _TCHAR* argv[])4 {5 int a=2,b=3;6 int c=add(a,b);7 return 0;8 }
編譯可以了!運行肯定不行,你得add在dll裡面呢,這時候把Mydll放到相應目錄下面就行了。
以上就是自動載入dll,其實多半的開源庫都是自動載入的函數地址(不然要手動載入地址累死了)。
1.2 下面說一下手動的方法:利用windows介面函數,尋找dll庫中的函數地址,載入並應用。
1 #include "stdafx.h" 2 #include <windows.h> 3 typedef int (*func)(int,int); 4 typedef int (*func)(int,int); 5 INSTANCE hdll=LoadLibraryA("Mydll2.dll"); //載入 6 unc anotherAdd=(func)GetProcAddress(hdll,"add"); //獲得地址 7 //int a=5,b=7; 8 int c= anotherAdd(a,b); 9 FreeLibrary(hdll);10 return 0;11 }
這個就是兩種載入動態方法。
2.靜態庫的應用 解釋一下,靜態庫的優點就是啟動並執行快,缺點是佔用記憶體大。因為它所有的資料和代碼都放到了可執行程式中。
靜態庫的製作:
1.建立win32空項目。當然,要選擇你要做靜態庫。
2.建立一個類 MathFuncsLib
MathFuncsLib.h
namespace MathFuncs{ class MyMathFuncs { public: static double Add(double a, double b); static double Subtract(double a, double b); static double Multiply(double a, double b); static double Divide(double a, double b); };}
MathFuncsLib.cpp
// MathFuncsLib.cpp// compile with: /c /EHsc// post-build command: lib MathFuncsLib.obj#include "MathFuncsLib.h"#include <stdexcept>using namespace std;namespace MathFuncs{ double MyMathFuncs::Add(double a, double b) { return a + b; } double MyMathFuncs::Subtract(double a, double b) { return a - b; } double MyMathFuncs::Multiply(double a, double b) { return a * b; } double MyMathFuncs::Divide(double a, double b) { if (b == 0) { throw new invalid_argument("b cannot be zero!"); } return a / b; }}
編譯運行 在debug裡面就有了 一個檔案 MathFuncsLib.lib
接下來是 靜態庫的應用了。其實就像用剛才用引導庫一樣。(其實原理是一樣的,只是這個靜態載入的東西更多了)。
好的,設定完了,你就可以用了(記得包含標頭檔以及命名空間an哦!!)
把庫的知識鬧懂了,其實特別有用。至少對我來說,當我再去使用別人的庫的時候,我會更輕鬆的理解和使用。
當然,開發自己的程式是也可以採用這種方式,更加可靠和快速!歡迎指正。