C_動態庫|靜態庫


動態庫

  • 動態鏈接庫簡稱DLL,同時以.dll 為后綴,主要用於提供代碼和數據

    • dll 並不是所有數據都能被訪問到,必須要進行導出

  • 動態鏈接庫在內存中始終只保存了一份數據,起到了節約內存的作用

  • 生成動態鏈接庫的時候會附帶一個 lib,這個lib叫做導入庫

    • 導入庫同於提供導出函數和數據在 dll 中所處的位置,不提供代碼

    • 如果使用隱式鏈接的方式使用動態鏈接庫,必須要 dll 文件

  • 動態鏈接庫的創建

  • //老師演示的時候是生成兩個文件。一個header.h。一個.cpp。
    //自己復習的時候,創建完生成了4個文件:header.h targetver.h dllmain.cpp 動態庫2.cpp
  •  

    方法一:聲明導出

    1.創建動態庫文件

    2.寫文件信息

    3.運行。

  • DLL 程序的入口函數(了解),可寫可不寫的函數

  • (寫在dllmain.cpp,函數定義也寫在這)

    // DLL 程序的入口函數,會在不同的情況下被調用
    BOOL APIENTRY DllMain( HMODULE hModule,
                          DWORD  ul_reason_for_call,
                          LPVOID lpReserved
                        )
    {
       return TRUE;
    }
  • 函數的導出方式:使用聲明進行導出

  • (寫在header.h)

    • DLL 導出的函數不應該有名稱粉碎,所以需要使用 extern "C" 取消名稱粉碎

    #ifdef _USRDLL
    // 如果是 dll 表示我需要聲明導出函數
    #define DLLAPI extern "C" _declspec(dllexport)
    #else
    // 如果是普通文件需要聲明使用的是導入到當前程序的函數
    #define DLLAPI extern "C"_declspec(dllimport)
    #endif

    // 聲明函數
    DLLAPI void show1();
    DLLAPI void show2();
    DLLAPI void show3();
  •  

     

  • 方法二函數的導出方式:使用模塊定義問文件進行導出

    1.創建動態庫文件

    2.寫文件

    3.設置模板定義

    4.運行

  • (寫在header.h)

    // 聲明函數
    void show1();
    void show2();
    void show3();
    //直接聲明函數,相比方法一,不需要DLLAPI宏定義聲明來粉碎名稱。
  • 新建一個文件,后綴名改def。名稱隨意。內容如下。

    • 模塊定義文件自己會取消名稱粉碎,推薦使用

    EXPORTS
    show1 @ 1
    show2 @ 2
    show3 @ 3
  •  

  • 動態鏈接庫的使用方式

    • 顯示的使用動態鏈接庫

    // 2. 顯示連接,依賴於一組API
    HMODULE hModule = LoadLibrary(L"../Debug/04. 動態庫和靜態庫.dll");

    // 2.1 如果返回值非 0, 就獲取函數
    if (hModule) fun = (pfun)GetProcAddress(hModule, "show1");

    // 2.2 如果函數非空,就調用函數
    if (fun) fun();
    • 隱式鏈接使用動態連接庫

    // 1. 使用隱式鏈接的方式調用導出函數
    #include "../04. 動態庫和靜態庫/framework.h"
    ////需要把生成的頭文件拷貝到該文件下才能包含成功/////
    #pragma comment(lib, "../Debug/04. 動態庫和靜態庫.lib")
    ////生成的動態lib文件,可以不在該文件目錄下////

    // 1.1 調用隱式鏈接的函數
    show1();

// 包含頭文件是為了獲取函數的聲明

  
 

#### 靜態庫

- 靜態庫的創建

 



- 靜態庫會生成一個 lib 文件,提供了所有的代碼,又叫做**對象庫**

- (此處截圖用的跟上面動態同一個文件,只是更改了生成方式)



#### 靜態鏈接庫和動態鏈接庫的區別

- 使用 dll 的程序必須自帶 dll,使用 lib 的程序可以不帶 lib
- 使用 dll 的程序通常比較小,使用 lib 的程序通常比較大
- 使用 lib 的程序可以進行跨平台
- 靜態鏈接庫的 lib 和 的動態鏈接庫的 lib 不同,分別是對象庫和導入庫

11


免責聲明!

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



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