静态链接&动态链接

静态链接&动态链接

面试小纸条   2009-07-29 21:49   阅读50   评论0  
字号:    
1、静态库和动态库:
     静态库是把程序运行时需要使用的函数编译在一个二进制文件中,扩展名为.lib。当程序link时把静态库中的二进制数据和程序其它数据放到一起。程序运 行时不在需要lib和dll文件的支持。这样做的坏处是开发出来的程序占用磁盘空间较大。特别是windows系统中本来就有或很多程序运行都需要的函数 完全没有必要每次开发程序时都要使用各自的静态库。
     动态库在开发时仅是把dll中的函数名和参数放到应用程序中,应用程序运行时根据函数名和参数调用dll中的函数来运行,这样操作系统中的应用程序可以同 时使用同一个dll。可以有效地节省硬盘空间,当然这样做使得程序设计更有层次。也有利于软件工程师的分工和信息安全。

2、windows api与dll:
     windows api中的所有函数均包含在dll中,当然不会是一个dll。其中最为重要的3个windows api的dll文件是:
          (1)Kernel32.dll 主要是管理内存、进程和线程的函数的集合;
          (2)User32.dll 执行用户界面的任务的函数(比如:窗口的创建销毁放大缩小、消息的传递等等与用户相关的操作);
          (3)GDI32.dll 包含用于画图和显示文本的各个函数;

3、静态链接:
     链接程序搜索一个或者多个库文件(标准库.lib),直到在某个库中找到了含有所引用函数的对象模块,然后链接程序把这个对象模块拷贝到结果可执行文件(.exe)中。链接程序维护对该函数的所有引用,使它们指向该程序中现在含有该函数拷贝的地方。

4、动态链接:
     链接程序也是搜索一个或者多个库文件(输入库.lib),当在某个库中找到了所引用函数的输入记录时,便把输入记录拷贝到结果可执行文件中,产生一次对该 函数的动态链接。这里,输入记录不包含函数的代码或者数据,而是指定一个包含该函数代码以及该函数的顺序号或函数名的动态链接库。

5、加载时动态链接:
     当程序运行时,Windows装入程序,并寻找文件中出现的任意动态链接。对于每个动态链接,Windows装入指定的DLL并且把它映射到调用进程的虚 拟地址空间(如果没有映射的话)。因此,调用和目标函数之间的实际链接不是在链接应用程序时一次完成的(静态),相反,是运行该程序时由Windows完 成的(动态)。这种动态链接称为加载时动态链接。链接动态链接库里的函数的方法如下:
     Windows搜索要装入的DLL时,按以下顺序:
     应用程序所在目录→当前目录→Windows SYSTEM目录→Windows目录→PATH环境变量指定的路径。

6、运行时动态链接:
     程序员使用LoadLibrary把DLL装入内存并且映射DLL到调用进程的虚拟地址空间(如果已经作了映射,则增加DLL的引用计数)。首 先,LoadLibrary搜索DLL,搜索顺序如同加载时动态链接一样。然后,使用GetProcessAddress得到DLL中输出函数的地址,并 调用它。最后,使用FreeLibrary减少DLL的引用计数,当引用计数为0时,把DLL模块从当前进程的虚拟空间移走。

7、引入库和动态库:
     引入库和动态库是成对出现的,在编译dll的时候会同时产生一个引入库,扩展名为lib。lib中仅含有dll中的函数名和参数,真正的函数体在动态库中。两个的关系大概相当于.h和.cpp文件之间的关系。

8、引入库和静态库:
     引入库和静态库的扩展名均为*.lib,但是引入库仅包含一些函数名和参数信息,没有函数体,是为调用动态库服务的,它和动态库的关系也相当于.h文件和.cpp文件之间的关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值