`
jandroid
  • 浏览: 1933565 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

静态链接库LIB和动态链接库DLL的区别 创建和示例

 
阅读更多

.什么是静态连接库,什么是动态链接库
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接 库。静态链接库与静态链接库调用规则总体比较如下。

对于静态链接库(比较简单):
首先,静态链接库的使用需要库的开发者提供生成库的.h头文件和.lib文件。

生成库的.h头文件中的声明格式如下:
extern "C" 函数返回类型 函数名(参数表);
在调用程序的.cpp源代码文件中如下:
#include "../lib.h"
#pragma comment(lib,"..//debug//libTest.lib")

//指定与静态库一起链接

第二,因为静态链接库是将全部指令都包含入调用程序生成的EXE文件中。因此如果用的是静态链接库,那么也就不存在“导出某个函数提供给用户使用”的情况,要想用就得全要!要不就都别要!:)

对于动态链接库:
动态链接库的使用,根据不同的调用方法,需要提供不同的资源:

1. 静态加载------程序静态编译的时候就静态导入dll,这样的话就需要提供给库使用者(C客户)如下文件:*.lib文件和.dll文件和*.h。其有2个坏处:

    1 程序一开始运行就需要载入整个dll,无法载入程序就不能开始运行;
    2 由于载入的是整个dll,需要耗费资源较多

其调用方法如下:

#include "../lib.h"
#pragma comment(lib,"..//debug//libTest.lib")

但是这种方式的话可以调用Class method.

2.动态加载-----那么只需要提供dll文件。

因此调用程序若想调用DLL中的某个函数就要以某种形式或方式指明它到底想调用哪一个函数。但是无法调用Class method了。
如果要调用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);

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,那么客户端就可以调用我们编写的静态链接库了。

示例之二:
动态链接库的创建



首先我们必须先注意到DLL内的函数分为两种:
(1)DLL 导出函数,可供应用程序调用;
(2)DLL 内部函数,只能在 DLL 程序使用,应用程序无法调用它们。

我们还是创建一个自定义的字符串处理类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"

classMYDLL_APICHironString //加上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文件。

客户端的调用:
1.如果是静态加载,那么需要提供*.lib和*.h,运行时候需提供*.dll

2.如果是动态加载,只需要提供*.dll即可。

分享到:
评论

相关推荐

    静态链接库LIB和动态链接库DLL借鉴.pdf

    在这篇文章中,我们主要讨论了静态链接库(LIB)和动态链接库(DLL)的区别、使用以及它们在编程实践中的应用。 首先,我们来看静态链接库(LIB)。静态链接库是编译时链接的一种库文件,它会在程序生成可执行文件...

    静态、动态链接库的创建和调用

    在现代软件开发中,为了代码复用和模块化设计,经常会用到静态链接库和动态链接库这两种形式的库。静态链接库在编译时期与应用程序链接,而动态链接库则在运行时期加载。 首先,我们来谈谈静态链接库。创建静态库的...

    VC6静态链接库(LIB文件)的创建、使用

    在Microsoft Visual C++ 6.0 (VC6) 中,静态链接库(LIB文件)是一种重要的编程资源,它包含了预编译的函数和类,可供其他应用程序在编译时直接集成,无需运行时动态链接。下面我们将深入探讨如何创建和使用VC6中的...

    c++ 静态链接库动态链接库示例

    静态链接库和动态链接库是两种主要的链接库类型,它们各有优缺点,适用于不同的开发场景。本篇文章将详细探讨这两种链接库的概念、创建过程以及如何在C++项目中使用它们。 **静态链接库(Static Linking Library)*...

    静态链接库和动态链接库

    ##### 4.2 C静态链接库LIB的制作 在Visual Studio中制作静态链接库的基本步骤如下: 1. 创建一个新的Win32 Static Library项目。 2. 添加必要的源文件和头文件。 3. 编译项目生成`.lib`文件。 4. 在需要使用该库的...

    VC++动态链接库(DLL)编程深入浅出(全).pdf

    - **静态链接库与动态链接库的区别**:静态链接库与动态链接库都是为了实现代码的共享和复用而设计的。在静态链接库中,库文件会被直接编译进最终的可执行文件(EXE)中,无法在运行时被替换。相比之下,使用动态链接...

    动态链接库(DLL)编程深入浅出

    其中静态链接库和动态链接库的主要区别在于: - **静态链接库**:在编译阶段,静态库中的代码会被直接嵌入到最终生成的可执行文件(EXE)中。这种方式增加了可执行文件的大小,并且无论是否使用库中的所有功能,库...

    静态链接库例子(lib)

    静态链接库与动态链接库(DLL)的主要区别在于,DLL在运行时才加载,可以减少程序大小并实现动态更新。但DLL需要在系统路径中可找到,否则会导致运行错误。在选择使用静态链接库还是动态链接库时,需要权衡体积、...

    WS2_32.lib静态链接库及使用方法

    首先,我们需要理解静态链接库与动态链接库的区别。静态链接库(如WS2_32.lib)在编译时会将库中的函数代码合并到最终的可执行文件中,这样运行时就不需要额外的dll文件。而动态链接库(如ws2_32.dll)则是在程序...

    DLL.rar_link_mfc 静态库_动态链接库_链接库

    它们分为静态链接库(Static Library)和动态链接库(Dynamic Link Library,简称DLL)。本压缩包中的资源,如"LIBTEST"、"dllTest"、"dllCall"、"libCall"等,都是围绕这两种链接库类型进行的实例,旨在帮助开发者...

    深入浅出Visual_C++动态链接库(Dll)编程.pdf

    - **创建静态链接库**:在Visual C++ 6.0中新建一个名为`libTest`的静态库项目,并添加两个文件:`lib.h`和`lib.cpp`。`lib.h`文件中声明了一个外部函数`add()`,而`lib.cpp`文件实现了该函数。编译完成后,将得到一...

    vc加载静态和动态链接库

    静态链接库和动态链接库是两种主要的链接库类型,它们在程序编译和运行时有不同的工作方式。本篇文章将深入探讨这两种链接库在MFC(Microsoft Foundation Classes)环境下的使用,并通过提供的代码实例来帮助理解。 ...

    静态链接库的使用

    与动态链接库(Dynamic Link Library, DLL)不同,静态链接库在编译阶段就会被链接到目标程序中,成为可执行文件的一部分。这种方式使得最终生成的应用程序无需依赖外部的库文件,提高了应用程序的独立性和移植性。 ...

    VC_6_DLL_小例子

    这个压缩包可能包含了关于如何创建、使用静态链接库(LIB)以及动态链接库(DLL)的示例代码和相关文档。接下来,我们将深入探讨这些关键概念。 首先,我们要理解什么是静态链接库(LIB)。静态链接库是将多个函数...

Global site tag (gtag.js) - Google Analytics