那位高手帮忙讲一下,什么叫动态库。尽量简单明了一点,谢谢
2013-11-07
展开全部
一、动态链接库的概念
动态链接库(Dynamic Link Library,缩写为DLL)是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。动态链接库文件的扩展名一般是dll,也有可能是drv、sys和fon,它和可执行文件(exe)非常类似,区别在于DLL中虽然包含了可执行代码却不能单独执行,而应由Windows应用程序直接或间接调用。
动态链接是相对于静态链接而言的。所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。换句话说,函数和过程的代码就在程序的exe文件中,该文件包含了运行时所需的全部代码。当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。当要执行所调用DLL中的函数时,根据链接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。
一般情况下,如果一个应用程序使用了动态链接库,Win32系统保证内存中只有DLL的一份复制品,这是通过内存映射文件实现的。DLL首先被调入Win32系统的全局堆栈,然后映射到调用这个DLL的进程地址空间。在Win32系统中,每个进程拥有自己的32位线性地址空间,如果一个DLL被多个进程调用,每个进程都会收到该DLL的一份映像。与16位Windows不同,在Win32中DLL可以看作是每个进程自己的代码。
二、动态链接库的优点
1. 共享代码、资源和数据
使用DLL的主要目的就是为了共享代码,DLL的代码可以被所有的Windows应用程序共享。
2. 隐藏实现的细节
DLL中的例程可以被应用程序访问,而应用程序并不知道这些例程的细节。
3. 拓展开发工具如Delphi的功能
由于DLL是与语言无关的,因此可以创建一个DLL,被C++、VB或任何支持动态链接库的语言调用。这样如果一种语言存在不足,就可以通过访问另一种语言创建的DLL来弥补。
三、动态链接库的实现方法
1. Load-time Dynamic Linking
这种用法的前提是在编译之前已经明确知道要调用DLL中的哪几个函数,编译时在目标文件中只保留必要的链接信息,而不含DLL函数的代码;当程序执行时,利用链接信息加载DLL函数代码并在内存中将其链接入调用程序的执行空间中,其主要目的是便于代码共享。
2. Run-time Dynamic Linking
这种方式是指在编译之前并不知道将会调用哪些DLL函数,完全是在运行过程中根据需要决定应调用哪个函数,并用LoadLibrary和GetProcAddress动态获得DLL函数的入口地址。
代码如下:
在Microsoft Visual Studio .NET 2003中创建动态链接库的步骤如下:
1.新建项目
2.Win32 控制台项目
3.应用程序设置
4.选择DLL项
完成,直接在后面添加代码即可:
extern "C" _declspec(dllexport) int sum(int x,int y)
{
return x+y;
}
代码编辑完成后,选择“生成”菜单中的“生成mydll”,即可生成动态连接库文件。
下面是测试动态连接库的代码:
#include
#include
int main(void)
{
typedef int (*pf)(int,int);
pf add;
HINSTANCE his;
if((his=LoadLibrary("mydll"))==NULL)
{
printf("load dll error\n");
return -1;
}
if((add=(pf)GetProcAddress(his,"add"))==NULL)
{
printf("load function error\n");
return -1;
}
printf("%d\n",add(10,20));
FreeLibrary(his);
return 0;
}
动态链接库(Dynamic Link Library,缩写为DLL)是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。动态链接库文件的扩展名一般是dll,也有可能是drv、sys和fon,它和可执行文件(exe)非常类似,区别在于DLL中虽然包含了可执行代码却不能单独执行,而应由Windows应用程序直接或间接调用。
动态链接是相对于静态链接而言的。所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。换句话说,函数和过程的代码就在程序的exe文件中,该文件包含了运行时所需的全部代码。当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。当要执行所调用DLL中的函数时,根据链接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。
一般情况下,如果一个应用程序使用了动态链接库,Win32系统保证内存中只有DLL的一份复制品,这是通过内存映射文件实现的。DLL首先被调入Win32系统的全局堆栈,然后映射到调用这个DLL的进程地址空间。在Win32系统中,每个进程拥有自己的32位线性地址空间,如果一个DLL被多个进程调用,每个进程都会收到该DLL的一份映像。与16位Windows不同,在Win32中DLL可以看作是每个进程自己的代码。
二、动态链接库的优点
1. 共享代码、资源和数据
使用DLL的主要目的就是为了共享代码,DLL的代码可以被所有的Windows应用程序共享。
2. 隐藏实现的细节
DLL中的例程可以被应用程序访问,而应用程序并不知道这些例程的细节。
3. 拓展开发工具如Delphi的功能
由于DLL是与语言无关的,因此可以创建一个DLL,被C++、VB或任何支持动态链接库的语言调用。这样如果一种语言存在不足,就可以通过访问另一种语言创建的DLL来弥补。
三、动态链接库的实现方法
1. Load-time Dynamic Linking
这种用法的前提是在编译之前已经明确知道要调用DLL中的哪几个函数,编译时在目标文件中只保留必要的链接信息,而不含DLL函数的代码;当程序执行时,利用链接信息加载DLL函数代码并在内存中将其链接入调用程序的执行空间中,其主要目的是便于代码共享。
2. Run-time Dynamic Linking
这种方式是指在编译之前并不知道将会调用哪些DLL函数,完全是在运行过程中根据需要决定应调用哪个函数,并用LoadLibrary和GetProcAddress动态获得DLL函数的入口地址。
代码如下:
在Microsoft Visual Studio .NET 2003中创建动态链接库的步骤如下:
1.新建项目
2.Win32 控制台项目
3.应用程序设置
4.选择DLL项
完成,直接在后面添加代码即可:
extern "C" _declspec(dllexport) int sum(int x,int y)
{
return x+y;
}
代码编辑完成后,选择“生成”菜单中的“生成mydll”,即可生成动态连接库文件。
下面是测试动态连接库的代码:
#include
#include
int main(void)
{
typedef int (*pf)(int,int);
pf add;
HINSTANCE his;
if((his=LoadLibrary("mydll"))==NULL)
{
printf("load dll error\n");
return -1;
}
if((add=(pf)GetProcAddress(his,"add"))==NULL)
{
printf("load function error\n");
return -1;
}
printf("%d\n",add(10,20));
FreeLibrary(his);
return 0;
}
2013-11-07
展开全部
动态链接库是相对于静态链接库而定义的
如果你用过 C 语言的话,肯定会用到一些函数,而这些函数又不是你自己写的,比如:printf 之类,其实这些函数的具体代码存在于指定的 .lib 文件内,在程序被编译时 .lib 文件也一起被编译到 C 语言写的程序中去,这个就是静态的链接库,已经写好的一些代码,编译后以lib的形式存在,在生成exe文件的时候又被包含进去
而动态链接库是为了弥补lib的缺陷而存在的,试想一下,如果 windows 是用 C 语言编写的,那微软自己肯定会开发出一些 lib 供,windows 的程序调用,但是 windows 下有那么多的应用,每一个exe文件都要包含一样的 lib 文件,那多浪费空间啊,于是就开始有了 dll即动态链接库,
它的工作机理是这样的
当程序被执行时,装载器发现当前执行的程序需要调用一个外部的函数,而这个函数又存在在 某个 dll 文件中,于是就自动将 dll,文件映射进内存,然后就可以正常运行了
如果你用过 C 语言的话,肯定会用到一些函数,而这些函数又不是你自己写的,比如:printf 之类,其实这些函数的具体代码存在于指定的 .lib 文件内,在程序被编译时 .lib 文件也一起被编译到 C 语言写的程序中去,这个就是静态的链接库,已经写好的一些代码,编译后以lib的形式存在,在生成exe文件的时候又被包含进去
而动态链接库是为了弥补lib的缺陷而存在的,试想一下,如果 windows 是用 C 语言编写的,那微软自己肯定会开发出一些 lib 供,windows 的程序调用,但是 windows 下有那么多的应用,每一个exe文件都要包含一样的 lib 文件,那多浪费空间啊,于是就开始有了 dll即动态链接库,
它的工作机理是这样的
当程序被执行时,装载器发现当前执行的程序需要调用一个外部的函数,而这个函数又存在在 某个 dll 文件中,于是就自动将 dll,文件映射进内存,然后就可以正常运行了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-11-07
展开全部
静态库是编写的时候加载进源代码进行编译的,如各种头文件。动态库是在程序运行的时候映射进程序的内存空间进行动态加载的,如DLL文件。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-11-07
展开全部
如果你学习拉C,你就很容易明白拉!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询