靜態連結庫LIB和動態連結程式庫DLL的區別 (dev-c libmySQL.lib、libmySQL.dll)

來源:互聯網
上載者:User
靜態連結庫LIB和動態連結程式庫DLL的區別 建立和樣本

1.什麼是靜態串連庫,什麼是動態連結程式庫
         靜態連結庫與動態連結程式庫都是共用代碼的方式,如果採用靜態連結庫,則無論你願不願意,lib 中的指令都全部被直接包含在最終產生的 EXE 檔案中了。但是若使用 DLL,該 DLL 不必被包含在最終 EXE 檔案中,EXE 檔案執行時可以“動態”地引用和卸載這個與 EXE 獨立的 DLL 檔案。靜態連結庫和動態連結程式庫的另外一個區別在於靜態連結庫中不能再包含其他的動態連結程式庫或者靜態庫,而在動態連結程式庫中還可以再包含其他的動態或靜態連結 庫。靜態連結庫與靜態連結庫調用規則總體比較如下。

對於靜態連結庫(比較簡單):
首先,靜態連結庫的使用需要庫的開發人員提供產生庫的.h標頭檔和.lib檔案。

產生庫的.h標頭檔中的聲明格式如下:
extern "C" 函數傳回型別 函數名(參數表);
在調用程式的.cpp原始碼檔案中如下:
#include "..\lib.h"
#pragma comment(lib,"..\\debug\\libTest.lib")
//指定與靜態庫一起連結

第二,因為靜態連結庫是將全部指令都包含入調用程式產生的EXE檔案中。因此如果用的是靜態連結庫,那麼也就不存在“匯出某個函數提供給使用者使用”的情況,要想用就得全要!要不就都別要!:)

對於動態連結程式庫:
動態連結程式庫的使用需要庫的開發人員提供產生的.lib檔案和.dll檔案。或者只提供dll檔案。
首先我們必須先注意到DLL內的函數分為兩種:
(1)DLL 匯出函數,可供應用程式調用;
(2)DLL 內建函式,只能在 DLL 程式使用,應用程式無法調用它們。
因此調用程式若想調用DLL中的某個函數就要以某種形式或方式指明它到底想調用哪一個函數。
如果dll中定義了 class,那麼調用該class之前也必須加入對該lib和標頭檔的引用。如下所示:
#include "..\lib.h"
#pragma comment(lib,"..\\debug\\libTest.lib")

2.樣本
樣本之一:
靜態連結庫的建立過程:

例如:我們建立一個自訂字串的類CHironString,
只需要在IDE裡面添加class即可,然後program相應函數體
代碼如下所示:
SDLL.h檔案
------------------------------------------------------------------------
// HironString.h: interface for the CHironString class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_HIRONSTRING_H__B23C5E5E_0E8B_4030_B057_34A40C934C59__INCLUDED_)
#define AFX_HIRONSTRING_H__B23C5E5E_0E8B_4030_B057_34A40C934C59__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CHironString 
{
private:

 char* m_data;
public:
 char * GetData();
 CHironString(CHironString &other);
 int Length();
 
 CHironString();
 CHironString(char * str);
 CHironString& operator=(CHironString &other);
 virtual ~CHironString();
};

#endif // !defined(AFX_HIRONSTRING_H__B23C5E5E_0E8B_4030_B057_34A40C934C59__INCLUDED_)

SDLL.CPP如下:
--------------------------------------------------------------
// HironString.cpp: implementation of the CHironString class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "HironString.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CHironString::CHironString()
{
 m_data=NULL;
}

CHironString::CHironString(char * str)
{
 int len=strlen(str);
 m_data=new char[len+1];
 strcpy(m_data,str);

}

CHironString::~CHironString()
{
 delete m_data;
}

int CHironString::Length()
{
 return strlen(m_data);
}

CHironString::CHironString(CHironString &other)
{
 int len=strlen(other.m_data)+1;
 m_data=new char[len];
 strcpy(m_data,other.m_data);
}

CHironString& CHironString::operator =(CHironString &other)
{
 if(this==&other)
  return *this;
 if(m_data!=NULL)
  delete[] m_data;
 int len=strlen(other.m_data)+1;
 m_data=new char[len];
 strcpy(m_data,other.m_data);
 return *this;
}

char * CHironString::GetData()
{
 return m_data;
}

然後,將程式編譯後產生sdll.lib。
客戶調用:將CHironString.h和SDLL.lib發布給client,那麼用戶端就可以調用我們編寫的靜態連結庫了。

樣本之二:
動態連結程式庫的建立

我們還是建立一個自訂的字串處理類CHironString,不同之處其是一個動態連結程式庫Dll。
動態連結程式庫的export 需要在在相應的標頭檔中編寫相應的MACRO
MyDll.h:自訂了一些類(函數)export 宏(該檔案由IDE自動產生)如下
------------------------------------------------------------------
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
這是匯出類的宏定義,將匯出類必須加上該宏,才能被匯出。
此處的MYDLL_EXPORTS會出現在 project-->settings-->C/C++頁面上的 PreProcessor definition中,這個MACRO表明其要定義一個匯出宏
CHironString.h 自訂類標頭檔
----------------------------------------------------------------
// HironString.h: interface for the CHironString class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_HIRONSTRING_H__518E9EC4_0837_4E45_9516_7D6A70CD3D0F__INCLUDED_)
#define AFX_HIRONSTRING_H__518E9EC4_0837_4E45_9516_7D6A70CD3D0F__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "MyDll.h"

class MYDLL_API CHironString   //加上MYDLL_API表明此為Export Class
{
private:

 char* m_data;
public:
 char * GetData();
 CHironString(CHironString &other);
 int Length();
 
 CHironString();
 CHironString(char * str);
 CHironString& operator=(CHironString &other);
 virtual ~CHironString();

};

#endif // !defined(AFX_HIRONSTRING_H__518E9EC4_0837_4E45_9516_7D6A70CD3D0F__INCLUDED_)

 CHironString.Cpp
------------------------------------------------------------

// HironString.cpp: implementation of the CHironString class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "HironString.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CHironString::CHironString()
{
 m_data=NULL;
}

CHironString::CHironString(char * str)
{
 int len=strlen(str);
 m_data=new char[len+1];
 strcpy(m_data,str);

}

CHironString::~CHironString()
{
 delete m_data;
}

int CHironString::Length()
{
 return strlen(m_data);
}

CHironString::CHironString(CHironString &other)
{
 int len=strlen(other.m_data)+1;
 m_data=new char[len];
 strcpy(m_data,other.m_data);
}

CHironString& CHironString::operator =(CHironString &other)
{
 if(this==&other)
  return *this;
 if(m_data!=NULL)
  delete[] m_data;
 int len=strlen(other.m_data)+1;
 m_data=new char[len];
 strcpy(m_data,other.m_data);
 return *this;
}

char * CHironString::GetData()
{
 return m_data;
}

經過compile之後,會產生MyDll.dll和MyDll.lib檔案。

用戶端的調用:
將MyDll.dll和MyDll.lib和CHironString交由client即可。
notes:
如果要調用Dll中的function,需要經曆3個步驟:
Handle h=LoadLibrary(dllName) --> GetProcAddress(h,functionName) 返回函數指標,通過函指標調用其function-->FreeLibrary(h)
例如:Another.dll有一個int Add(int x,int y)函數。則完整的調用過程如下:
typedef int (* FunPtr)(int,int);//定義函數指標
FunPtr funPtr;
Handle h=LoadLibrary("Another.dll");
funPtr=(FunPtr)GetProcAddress(h,"Add");
funPtr(2,3);//2+3;
FreeLibrary(h);

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.