天天看點

靜态連結庫和動态連結庫詳解

一.靜态庫

         用通俗的話講,靜态庫就是将代碼編譯到一個二進制檔案下(通常擴充名為.LIB).然後客戶

端調用程式,隻需要包含相關的.h檔案及LIB庫檔案一起連結到exe檔案中.可執行程式釋出後,不

再需要該.lib檔案了.

二.動态庫

   最終将編譯出.lib與.dll檔案. 注意.lib檔案與上面的靜态庫雖然擴充名相同,但有本質的

   差別.動态庫中的lib檔案是動态庫的引入庫. 該引入庫包含被DLL導出的函數和變量的"符号

   名".而靜态庫中的.lib包含了函數和資料,動态庫的函數和資料是編譯到.dll中.動态連結庫調

   用方式分為隐式調用與顯示調用(也稱靜态調用與動态調用)。

三.靜态庫的使用

1.下面來看看如何生成一個靜态庫

   (1)建立靜态庫工程,建立DllStaticLib.h及建立DllStaticLib.cpp檔案

   (2)DllStaticLib.h代碼如下:

靜态連結庫和動态連結庫詳解

   #ifndef _DLL_STATIC_LIB_H__

靜态連結庫和動态連結庫詳解

   #define _DLL_STATIC_LIB_H__

靜态連結庫和動态連結庫詳解
靜态連結庫和動态連結庫詳解

   extern "C"{

靜态連結庫和動态連結庫詳解

      int add(int x,int y);

靜态連結庫和動态連結庫詳解

   }

靜态連結庫和動态連結庫詳解
靜态連結庫和動态連結庫詳解
靜态連結庫和動态連結庫詳解

   #endif

靜态連結庫和動态連結庫詳解

   (3)DllStaticLib.cpp代碼如下:

靜态連結庫和動态連結庫詳解

   #include "DllStaticLib.h"

靜态連結庫和動态連結庫詳解

   #include "stdafx.h"

靜态連結庫和動态連結庫詳解
靜态連結庫和動态連結庫詳解

   int add(int x,int y)

靜态連結庫和動态連結庫詳解

   {

靜态連結庫和動态連結庫詳解

        return x+y;

靜态連結庫和動态連結庫詳解

   }

(4)最終生成DllStaticLib.lib靜态庫檔案

2.調用靜态庫

  (1)現在隻要使用DllStaticLib.lib,DllStaticLib.h檔案.

     (注意讓VC能搜尋到該檔案,設定VC相關的包含目錄與庫目錄.

  (2)調用代碼如下:

靜态連結庫和動态連結庫詳解

#include "stdafx.h"

靜态連結庫和動态連結庫詳解

#include <conio.h>

靜态連結庫和動态連結庫詳解

#include "DllStaticLib.h"//要設定VC包含目錄,以便編譯時能找到頭檔案

靜态連結庫和動态連結庫詳解
靜态連結庫和動态連結庫詳解

//要設定VC庫目錄,以便編譯連結時可以找到該DllStaticLib.lib

靜态連結庫和動态連結庫詳解

#pragma comment(lib,"DllStaticLib.lib")

靜态連結庫和動态連結庫詳解
靜态連結庫和動态連結庫詳解

int main(int argc, char* argv[])

靜态連結庫和動态連結庫詳解

{

靜态連結庫和動态連結庫詳解

    printf("%d\n",add(3,5));

靜态連結庫和動态連結庫詳解
靜态連結庫和動态連結庫詳解

    _getch();

靜态連結庫和動态連結庫詳解

    return 0;

靜态連結庫和動态連結庫詳解

}

四. 動态連結庫的使用

1.生成動态連結庫

  (1)建立動态連結庫工程,加入TestDll.h及TestDll.cpp檔案

  (2)TestDll.h代碼如下:

靜态連結庫和動态連結庫詳解

#ifndef _TEST_DLL_H__

靜态連結庫和動态連結庫詳解

#define _TEST_DLL_H__

靜态連結庫和動态連結庫詳解
靜态連結庫和動态連結庫詳解

#ifdef TESTDLL_EXPORTS

靜态連結庫和動态連結庫詳解

#define TESTDLL_API __declspec(dllexport)

靜态連結庫和動态連結庫詳解

#else

靜态連結庫和動态連結庫詳解

#define TESTDLL_API __declspec(dllimport)

靜态連結庫和動态連結庫詳解

#endif

靜态連結庫和動态連結庫詳解
靜态連結庫和動态連結庫詳解

extern "C" TESTDLL_API int sum(int x,int y);

靜态連結庫和動态連結庫詳解
靜态連結庫和動态連結庫詳解

#endif

 (3)TestDll.cpp代碼如下:

靜态連結庫和動态連結庫詳解

#include "TestDll.h"

靜态連結庫和動态連結庫詳解
靜态連結庫和動态連結庫詳解

int sum(int x,int y)

靜态連結庫和動态連結庫詳解

{

靜态連結庫和動态連結庫詳解

    return x+y;

靜态連結庫和動态連結庫詳解

}

  (3)注意,将工程中設定屬性定義TESTDLL_EXPORTS宏,以便确定該工程為DLL導出

  (4)最終生成TestDll.lib及TestDll.dll檔案

2.隐式調用Dll庫

  (1)建立win32控制台工程,加入DllClient.cpp

  (2)示例代碼如下:

靜态連結庫和動态連結庫詳解

#include <iostream>

靜态連結庫和動态連結庫詳解

#include <conio.h>

靜态連結庫和動态連結庫詳解

#include "TestDll.h" //要設定VC包含目錄,以便編譯時能找到頭檔案

靜态連結庫和動态連結庫詳解

using namespace std;

靜态連結庫和動态連結庫詳解
靜态連結庫和動态連結庫詳解
靜态連結庫和動态連結庫詳解

//要設定VC庫目錄,以便編譯連結時可以找到該DllStaticLib.lib

靜态連結庫和動态連結庫詳解

#pragma  comment(lib,"TestDll.lib")

靜态連結庫和動态連結庫詳解
靜态連結庫和動态連結庫詳解

int main(int argc,char *argv[])

靜态連結庫和動态連結庫詳解

{

靜态連結庫和動态連結庫詳解
靜态連結庫和動态連結庫詳解

    printf("%d\n",sum(8,9));

靜态連結庫和動态連結庫詳解

    _getch();

靜态連結庫和動态連結庫詳解

    return 0;

靜态連結庫和動态連結庫詳解

}

(3)說明,隐式調用需要lib檔案,但是exe編譯後,就不再需要lib,隻需要dll檔案即可.

     以下顯式調用不需要lib檔案,隻需要提供dll檔案.随exe運作與結束裝載或釋放dll檔案.

3.顯式調用Dll庫

(1)同上建立win32工程.加入cpp檔案,代碼如下:

靜态連結庫和動态連結庫詳解

#include <iostream>

靜态連結庫和動态連結庫詳解

#include <conio.h>

靜态連結庫和動态連結庫詳解

#include <windows.h>

靜态連結庫和動态連結庫詳解

using namespace std;

靜态連結庫和動态連結庫詳解
靜态連結庫和動态連結庫詳解

typedef int FUN_SUM(int x,int y);

靜态連結庫和動态連結庫詳解
靜态連結庫和動态連結庫詳解

int main(int argc,char *argv[])

靜态連結庫和動态連結庫詳解

{

靜态連結庫和動态連結庫詳解
靜态連結庫和動态連結庫詳解

    HINSTANCE hDll; //DLL句柄

靜态連結庫和動态連結庫詳解
靜态連結庫和動态連結庫詳解

    hDll = LoadLibrary(L"TestDll.dll");

靜态連結庫和動态連結庫詳解

    if (hDll != NULL)

靜态連結庫和動态連結庫詳解

    {

靜态連結庫和動态連結庫詳解

        FUN_SUM *sum = (FUN_SUM*)GetProcAddress(hDll, "sum");

靜态連結庫和動态連結庫詳解

        if(sum)

靜态連結庫和動态連結庫詳解

        {

靜态連結庫和動态連結庫詳解

            cout<<(*sum)(9,10)<<endl;

靜态連結庫和動态連結庫詳解

        }

靜态連結庫和動态連結庫詳解

        else

靜态連結庫和動态連結庫詳解

        {

靜态連結庫和動态連結庫詳解

            cout<<"擷取sum函數指針失敗!"<<endl;

靜态連結庫和動态連結庫詳解

        }

靜态連結庫和動态連結庫詳解
靜态連結庫和動态連結庫詳解

        FreeLibrary(hDll);

靜态連結庫和動态連結庫詳解

    }

靜态連結庫和動态連結庫詳解

    else

靜态連結庫和動态連結庫詳解

    {

靜态連結庫和動态連結庫詳解

        cout<<"裝載TestDll.dll失敗!"<<endl;

靜态連結庫和動态連結庫詳解

    }

靜态連結庫和動态連結庫詳解

    _getch();

靜态連結庫和動态連結庫詳解

    return 0;

靜态連結庫和動态連結庫詳解

}

建立動态連結庫項目:

1、打開Microsoft Visual Studio 2010,選擇File->New->Project。

2、在New Project中選擇Installed Templates->Visual C++->Win32。

3、選擇Win32 Console Application,設定名稱:simpledll,設定解決方案名:zdddll。

4、單擊OK,在出現的Win32 Application Wizard的Overview對話框中點選Next。

5、在Application Settings中,選擇Application type下的DLL。

6、勾選Additional options下的Empty project。

7、單擊Finish建立項目。

向動态連結庫添加類:

1、添加新類頭檔案。右鍵單擊simpledll項目,Add->New Item,選擇Header File(.h),設定名稱為simpledll,單擊Add。

2、添加新類源檔案。右鍵單擊simpledll項目,Add->New Item,選擇C++ File(.cpp),設定名稱為simpledll,單擊Add。

3、為新類添加内容。