dll和lib的区别



 一、定义


动态链接库:
(Dynamic Link Library),简称DLL(linux 为.so 成为share Object)。DLL 是一个包含可由多个程序同时使用的代码和数据的库。它允许程序共享执行特殊任务所必需的代码和其他资源,一般来说,DLL是一种磁盘文件,以.dll、.DRV、.FON、.SYS和许多以.EXE为扩展名的系统文件都可以是DLL。它由全局数据、服务函数和资源组成,在运行时被系统加载到调用进程的虚拟空间中,成为调用进程的一部分。DLL的调用可以分为两种:一种是隐式调用,一种是显示调用 这里简单分享DLL的两种调用方法。


静态连接库:
静态链接库就是你使用的.lib文件(linux 为.a),库中得代码最后需要连接到你的可执行文件中去,所以静态连接的可执行文件一般比较大一些。




二、区别:
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终的EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。


采用动态链接库的优点:(1)更加节省内存;(2)DLL文件与EXE文件独立,只要输出接口不变,更换DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性。


lib文件是在link的时候用   
dll文件是在Run的时候用
 
lib   是静态链接库   
dll   是动态链接库


lib编译后就不需要了 
dll你需要和你的程序一起发布才行   
 
lib将在连接时把一些代码拷贝到你的程序代码里,所以叫做静态连接   
dll是程序运行时把dll里的代码和资源加再到进程地址空间去,所以叫动态连接
 
动态链接与静态链接的不同之处在于:
动态链接允许可执行模块(.dll 文件或 .exe 文件)仅包含在运行时定位 DLL 函数的可执行代码所需的信息。
在静态链接中,链接器从静态链接库获取所有被引用的函数,并将库同代码一起放到可执行文件中。


三、lib与dll文件最大区别在调用方面:


【动态连接库的调用方法】
1 隐式的调用
       这种调用方式需要把产生动态连接库时产生的.LIB文件加入到应用程序的工程中,在使用DLL中的函数时,只须说明一下后就可以直接通过函数名调用DLL的输出函数,调用方法和程序内部其他的函数是一样的。隐式调用不需要调用LoadLibrary()和FreeLibrary()。程序员在建立一个DLL文件时,链接程序会自动生成一个与之对应的LIB导入文件。该文件包含了每一个DLL导出函数的符号名和可选的标识号,但是并不含有实际的代码。LIB文件作为DLL的替代文件被编译到应用程序项目中。
  当程序员通过隐式调用方式编译生成应用程序时,应用程序中的调用函数与LIB文件中导出符号相匹配,这些符号或标识号被写入到生成的EXE文件中。LIB文件中也包含了对应的DLL文件名(但不是完全的路径名),链接程序也将其存储在EXE文件内部。当应用程序运行过程中需要加载DLL文件时,Windows根据这些信息发现并加载DLL,然后通过符号名或标识号实现对DLL函数的动态链接。所有被应用程序调用的DLL文件都会在应用程序EXE文件加载时被加载在到内存中。


2 显式调用
       这种调用方式是指在应用程序中用LoadLibrary或MFC提供的AfxLoadLibrary显式的将自己所做的动态连接库调进来,并指定DLL的路径作为参数。LoadLibary返回HINSTANCE参数,应用程序在调用GetProcAddress函数时使用这一参数。当完成对动态链接库的导入以后,再使用GetProcAddress()获取想要引入的函数,该函数将符号名或标识号转换为DLL内部的地址,之后就可以象使用本应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,应该用FreeLibrary或MFC提供的AfxFreeLibrary释放动态连接库。


 【静态链接库的调用方法】


对静态链接库的讲解不是本文的重点,但是在具体讲解DLL之前,通过一个静态链接库的例子可以快速地帮助我们建立“库”的概念。




 


图1 建立一个静态链接库


如图1,在VC++6.0中new一个名称为libTest的static library工程,并新建lib.h和lib.cpp两个文件,lib.h和lib.cpp的源代码如下:


//文件:lib.h


#ifndef LIB_H


#define LIB_H


extern "C" int add(int x,int y);   //声明为C编译、连接方式的外部函数


#endif


//文件:lib.cpp
#include "lib.h"
int add(int x,int y)
{
return x + y;
}


编译这个工程就得到了一个libTest.lib文件,这个文件就是一个函数库,它提供了add的功能。将头文件lib.h和libTest.lib文件提交给用户后,用户就可以直接使用其中的add函数了。常用的标准C库函数(scanf、printf、memcpy、strcpy等)就来自这种静态库。


静态链接库的调用


下面来看看怎么使用这个库。在VC中new一个名为libCall的Win32 Console Application工程,并将上面生成的文件lib.h和libTest.lib文件拷贝到libCall的工程子目录下。libCall工程仅包含一个main.cpp文件,它演示了静态链接库的调用方法,其源代码如下:


#include <stdio.h>


#include "lib.h"


#pragma comment( lib, "libTest.lib" )   //指定与静态库一起连接


int main()


{


printf( "2 + 3 = %d", add( 2, 3 ) );


}


静态链接库的调用就是这么简单,或许我们每天都在用,可是我们没有明白这个概念。代码中#pragma comment( lib , "libTest.lib" )的意思是指本文件生成的.obj文件应与libTest.lib一起连接。


如果不用#pragma comment指定,则可以直接在VC++中设置,如图2,依次选择tools、options、directories、library files菜单或选项,填入库文件路径。图2中加圈的部分为我们添加的libTest.lib文件的路径。




 


图2 在VC中设置库文件路径


这个静态链接库的例子至少让我们明白了库函数是怎么回事,它们是哪来的。我们现在有下列模糊认识了:


(1)库不是个怪物,编写库的程序和编写一般的程序区别不大,只是库不能单独执行;


(2)库提供一些可以给别的程序调用的东东,别的程序要调用它必须以某种方式指明它要调用之。


以上从静态链接库分析而得到的对库的懵懂概念可以直接引申到动态链接库中,动态链接库与静态链接库在编写和调用上的不同体现在库的外部接口定义及调用方式略有差异。





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值