静态链接 动态链接 运行期

来源:互联网 发布:freescale单片机教程 编辑:程序博客网 时间:2024/05/01 16:12
基本概念
一个window程序就是一个可执行文件,它能够创建一个或者多个窗口并使用一个消息循环接受用户的输入。DDL(Dynamic link library)通常来说不可以直接执行,也无法接受消息。
DLL包含函数,这些函数可以被程序或者其他DLL调用以进行某种计算或者实现某些功能。

静态链接(static linking)
采用高级编程语言如C,PASCAL,FORTRAN编写的源代码需要经过编译、链接不同的函数库
才能生成可执行文件。函数库包含已编译函数的目标文件,这些函数通常完成一些常用的任务如计算平方根或者分配内存。当这些库函数被链接到一个程序里,它们就成为了程序可执行文件的一部分。所有对这些库函数的调用已经在链接阶段设定好了,这就称作为静态链接。

动态链接(Dynamic Linking)
动态链接机制使得程序可以在运行时链接函数库。函数库存在于自身的可执行文件里而不是像静态链接那样被拷贝到程序可执行文件里。这些函数库之所以被称作动态函数库(DLL)是因为他们只在被加载和执行阶段才链接到程序里而不是在链接阶段。当某个程序调用一个DLL,操作系统就将该DLL加载到内存,设定好指向DLL函数的参考指针使得这些函数能够被程序正确调用。如果该DLL不再被需要,操作系统就将DLL从内存中卸载。动态链接可以显式地由程序执行或者隐式的由操作系统完成。

静态链接函数库和动态函数库的区别

.静态链接函数库存在于.LIB文件,它是目标文件的集合,而动态函数库存在于单独的可执行文件里(.dll)。
.使用静态链接的程序则会包含函数库的一份拷贝,而DLL则允许多个程序共享。
.静态函数库只包含代码和数据,而DLL可以包含代码,数据和资源如位图,图表,光标。
.静态链接使用程序本身的地址空间,而DLL可以拥有自身的地址空间,这些地址空间可以被映射到程序的地址空间。


程序(exe)和动态函数库(dll)的区别


定义
.可执行文件指.exe或者.dll文件,它们包含可执行代码和资源
.程序是指.exe文件

.DLL是window 动态链接库,存在于.dll文件.系统DLL可能有.exe,.drv等文件扩展名。
只有后缀为.dll的可以被window自动加载,如果是其他后缀,程序需要显式的用LoadLibrary
函数加载。


DLL运行机制

DLL(dynamic-link library)动态链接库:
DLL是可执行文件,可以作为函数的共享库。动态链接(Dynamic linking)可以让一个进程调用不属于进程本身的函数,而这些函数的代码就位于DLL中。DLL同样可以共享数据和资源,多个程序可以同时访问某一个DLL的内容。

动态链接(Dynamic linking)与静态链接(static linking)的区别在于:
动态链接允许可执行模块只包含在运行过程中定位DLL函数的信息,而静态链接则直接将引用到的函数代码包含在可执行模块里。所以使用DLL使得可执行文件的大小比静态链接的小的多。如果许多程序都使用相同的DLL,则能够节省大量的硬盘和内存。


C/C++运行库(Run-time Library)的运行机制

DLL的初始化过程是由C/C++ run-time library代码完成。C/C++ run-time library代码包含DLL的入口(entry-point)函数_DllMainCRTStartup. _DllMainCRTStartup函数调用CRT_INIT函数,CRT_INIT初始化C/C++ run-time library 以及C++的静态全局变量(如果变量是对象,则调用对象的构造函数)。另外在初始化C run-time library的过程中,_DLLMainCRTStartup会调用DLLMain函数。DLLMain函数由Visual C++ 提供并链接到DLL代码中,以供_DLLMainCRTStartup调用。如果你想在DLL启动时做些初始化的工作,可以在DLLMain函数中添加你的代码。