C/C++ 關於生成靜態庫(lib)/動態庫(dll)文件如何使用(基於windows基礎篇)


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

        希望被很多的應用使用,需要經常的更新功能,經常被用來使用做劫持別人的文件。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM