1. 首先,如何制作一個靜態庫(lib)?
額, 對於靜態庫,我們知道,里頭是不應該有Main函數,它只是一個配合文件。之所以稱之為lib靜態庫,其實就是指,我們需要用到lib里頭的函數時,我們才會去手動打包到我們的可執行文件當中。我們知道,打包一個文件,里面的東西非常之多,當我們加載時,內存會被很多的代碼塊鎖占用,因而常常有一種,調用一個函數,而不得不去讀取一大片的代碼塊兒的感覺。這就是靜態庫的缺點沒有之一
就像寫一個這樣的程序:
1 #include<stdio.h> 2 #include<string.h> 3 #include<windows.h> 4 5 void msg(char text[] ){ 6 MessageBox(0, text, "title", 0); 7 } 8 9 int _max(int a , int b) { 10 11 return a > b ? a : b; 12 }
然后 將vs點擊屬性 --> 常規 -->Configuration Type 將Application (.exe) 改為Static library (.lib)就好了! 然后編譯即可!
生成之后,將該lib文件放置於我們項目的目錄中。在頭文件初,#prama comment(lib,"cof.lib");即可!
然后調用代碼如下:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 #pragma comment(lib,"staticlib.lib") //引入一個靜態庫 6 7 int main(int argv ,char args []){ 8 9 meg("你好!"); 10 printf("%d\n",_max(3,4)); 11 getchar(); 12 return 0; 13 }
2。 而動態庫的使用,則剛好避免了靜態庫這一個龐大而強占大量內存的缺點,它封裝了每一個函數,作為一個接口,當我們需要哪個的時候,就可以讀取哪個函數的代碼到內存塊中,占用的內存相對的小很多。那么如何生成一個dll呢?
關於動態庫的生成方式和lib差不離,將屬性改為 將Application (.exe) 改為 dll即可
不過在定義函數時需要在前面加載: declspec(dllexport)
代碼如下:
1 #include<stdio.h> 2 #include<string.h> 3 #include<windows.h> 4 5 _declspec(dllexport) void msg(char text[] ){ 6 MessageBox(0, text, "title", 0); 7 } 8 9 _declspec(dllexport) int _max(int a , int b) { 10 11 return a > b ? a : b; 12 }
那么生成了dll之后,如何來調用這個dll呢? 調用dll沒有像靜態庫那么簡單的用一個宏命令就可以使用了,相反這個過程還是稍稍的繁瑣了一些。
首先,我們需要定義一些函數指針,來指向這些dll函數地址。 如下面的代碼:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<windows.h> 4 5 //定義一個函數指針類型 6 typedef void(*pmeg)(char []); //指向meg的一個指針 7 //定義一個函數指針類型 8 typedef int(*pmax) (int ,int ); //定義一個指向_max的指針 9 10 int main(int argv ,int args[]){ 11 12 //定義了指針之后,我們需要使用widow API 來HMoDULE來定義一個模塊 13 HMODULE mdll; 14 mdll = LoadLibraryA("dongdll.dll"); //加載dll文件,需要帶路徑 15 if (NULL == mdll) { 16 printf("dll加載失敗"); 17 return ; 18 } 19 else{ 20 pmeg mymeg; 21 mymeg = (pmeg )GetProcAddress(mdll,"msg"); 22 if (mymeg != NULL) { 23 mymeg("nihao"); 24 } 25 else { 26 printf("沒有相關函數! msg"); 27 } 28 } 29 getchar(); 30 return 0; 31 }
但是,對於平時我們平時為什么可以直接注入dll到相應的執行文件中呢? 是因為我們覆蓋了我們執行文件的那塊兒內存,所以在能夠去run,我們給他加載的函數。
以上就是對於靜態庫和動態庫的生成和調用的方法。
對於靜態庫和動態庫的優缺點和使用用途:
dll和lib可以比作這樣的公司: dll就像一個外包的公司,可以被任意的程序使用,而lib就像一個大公司下的一個研發部分,只能加載到文件中才能被使用。
1. dll------- 不需要更新執行文件,只需要更新dll文件 ,而lib,每次更新,需要重新編譯源文件成執行文件。
2. dll 節約計算機資源,需要使用時加載,不需要使用時釋放。 lib 浪費較多的資源,是軟件的體積變得越來越龐大。
在這些情況下可以使用lib:
需要私有化,就是僅供自己使用時。不需要經常改動時文件時。
在這些情況下可以使用dll
希望被很多的應用使用,需要經常的更新功能,經常被用來使用做劫持別人的文件。