静态链接库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文件中。因此如果用的是静态链接库,那么也就不存在“导出某个函数提供给用户使用”的情况,要想用就得全要!要不就都别要!:)

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

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个步骤:
例如: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
这是导出类的宏定义,将导出类必须加上该宏,才能被导出。
// 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文件。

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

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

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

时间: 2024-10-26 12:00:44

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

静态链接库(lib)、动态链接库(dll)与动态链接库的导入库(lib)

静态链接库与动态链接库相对应.动态链接库的导入库不同于以上两种库. 1.静态链接库(lib) 程序编译一般需经编辑.编译.连接.加载和运行几个步骤.在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为"库"文件(lib), 这种LIB中有函数的实现代码.在静态编译时,它是将LIB中的代码加入目标模块(EXE或者DLL)文件中,所以链接好了之后,LIB文件就没有用了. 2.动态链接库(dll) 动态链接库(Dynamic Link Library,缩写为DLL)是一个可以被其

Visual Studio 2017 动态链接库(DLL /LIB) 静态链接库(LIB)的思考

软件工程方面能够快速的发展,我相信源代码重用起到了不可忽略的作用.在Linux平台下就C++而言,有以so结尾的动态链接库文件,也有以.a结尾的静态连接库文件,这个有着明显的区别.但是在Window平台下,通过Visual Studio编译动态链接库DLL这类项目时,即生成了目的动态链接库DLL文件,同时还有一个同名的LIB文件.单独编译静态连接库项目时也生成了目标静态链接库LIB文件. **动态链接库** 在其他项目中需要引用动态连接库时,需要把动态连接库的LIB文件作为资源引入到新项目当中,

windows中静态库lib和动态dll的区别及使用方法

1. 静态库lib和动态dll的区别 1.1 项目类型 VS在建Win32项目时,有以下选项: windows应用程序控制台应用程序DLL静态库最后两个类型:DLL和静态库,这两种项目类型是不可以单独运行的,必须在Windows应用程序调用他们执行,是提供的库函数而已. 1.2 两种lib的区别: (1)静态库(.lib) 函数和数据被编译进一个二进制文件(通常扩展名为.LIB).在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其他模块组合起来创建

动态链接库dll,导入库lib,静态链接库lib

目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”).  静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为Archive,即合并到一起.比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib只是壳子.  动态库一般会有对应的导入库,方便程序静态载入动态链接库,否则你可能就需要自己Load

Qt下使用的静态链接库------ *.lib转化为mingw使用的.a格式的静态库

使用MinGW附带的工具reimp.exe,该工具一般在MinGW in目录下,其readme文档在MinGWdoc eimp目录下, 方法很简单,比如: C:CodeBlocksMinGWlibdx9>reimp d3d8.lib 就会生成一个“libd3d8.a”文件,这个文件就可以让基于MinGW的编译器链接使用了. 我用这个方法成功的把DirectX9c的.lib库转化成了.a库,并在CodeBlocks下编译成功了其生成的dx项目, 但是有三个.lib文件无法通过这个方法转换:DxEr

动态链接库和静态链接库

#1,静态链接库 lib指令在exe中: 不能再包含其他动态库或静态库: #2,动态链接库 该dll不必在最终exe文件中: exe可"动态"引用或卸载这个dll: 可以包含其他的动态库或者静态库: #3,动态库的其他概念 dll的编程机制与具体的编程语言和编译器无关: 动态链接库随处可见 Kernel32.dll:主要处理内存管理和进程调度: user32.dll:主要控制用户界面: gdi32.dll:负责图形方面的操作: VC动态链接库分类 Non-MFC dll:不采用MFC类

静态链接库与动态链接库

静态链接库与动态链接库都是共享代码的方式. 静态链接库(lib): 在程序执行之前完成所有的组装工作,生成一个可执行的目标文件(EXE文件). 静态库的两个特点: 链接后产生的可执行文件包含了所有需要调用的函数的代码,因此占用磁盘空间较大. 如果有多个(调用相同库函数的)进程在内存中同时运行,内存中就存有多份相同的库函数代码,因此占用内存空间较多. 动态链接库(dll&lib): 在程序装载内存的时候才真正的把库函数代码链接进行确定它们的地址,并且就算有几个程序同时运行,内存也只存在一份函数代码

静态链接库与动态链接库详解

转载: 关于静态链接库(Lib,.A)与动态链接库(DLL,.SO) (2011-10-10 21:04:26) 转载▼   分类: c.vc.cpp 在windows下一般可以看到后缀为dll和后缀为lib的文件,但这两种文件可以分为三种库,分别是动态链接库(Dynamic-Link Libraries),目标库(Object Libraries)和导入库(Import Libraries),下面一一解释这三种库. 目标库(Object Libraries) 目标库又叫静态链接库,是扩展名为.

静态链接库和动态链接库的区别及优缺点

动态链接库和静态链接库的区别 本文参考了以下博客:      1. http://blog.csdn.net/gamecreating/article/details/5504152      2. http://blog.csdn.net/left_la/article/details/12098545      3. http://blog.csdn.net/augusdi/article/details/6460415 静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序