静态链接库和动态链接库

 
 

  • 静态链接库(lib):静态库是一个或者多个obj文件的打包,从obj文件生成lib的过程称为Archive,即合并到一起。比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib只是壳子。代码中不需要任何关键字来导出函数。
  • 动态链接库 (DLL) 是作为共享函数库的可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL 副本的内容。动态库一般会有对应的导入库(lib),方便程序隐式载入动态链接库,否则你可能就需要自己LoadLibary调入DLL文件,然后再手工GetProcAddress获得对应函数了。有了导入库,你只需要链接导入库后按照头文件函数接口的声明调用函数就可以了。 代码中有关键字__declspec(dllexport)导出函数或者用def文件导出函数。
  • 动态链接库与静态链接库的区别:在于它允许可执行模块(.dll 文件或 .exe 文件)仅包含在运行时定位 DLL 函数的可执行代码所需的信息。在静态链接库中,链接器从静态链接库获取所有被引用的函数,并将库同代码一起放到可执行文件中。 
  • 使用动态链接代替静态链接有若干优点。DLL 节省内存,减少交换操作,节省磁盘空间,更易于升级,提供售后支持,提供扩展 MFC 库类的机制,支持多语言程序,并使国际版本的创建轻松完成。
  • 导入库和静态链接库的区别很大。静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息
  • 静态链接库调用方法:首先#include "xxx.h",其次#pragma comment(lib,"xxx.lib") 或者 project settting里将xxx.lib加入到additional dependencies.
  • 动态链接库调用方法:(1)加载时链接:应用程序像调用本地函数一样对导出的 DLL 函数进行显式调用。要使用加载时动态链接,请在编译和链接应用程序时提供头文件 (.h) 和导入库文件 (.lib)。当您这样做时,链接器将向系统提供加载 DLL 所需的信息,并在加载时解析导出的 DLL 函数的位置。即需要向静态链接库一样的调用方法,只是需要多了copy了一个dll到应用程序那边。 (2)运行时链接:应用程序调用 LoadLibrary 函数或 LoadLibraryEx 函数以在运行时加载 DLL。成功加载 DLL 后,可以使用 GetProcAddress 函数获得要调用的导出的 DLL 函数的地址。在使用运行时动态链接时,不需要#include "xxx.h",以及导入库(lib),只要dll即可。如果dll导出时使用extern "C",则GetProcAddress()里面的函数名就是初始导出的函数名(如myMin);如果如果dll导出时没有使用extern "C",则GetProcAddress()需要mangling name(可以通过dependency walker打开dll来找到)。
  • 调用静态库或者动态库的应用程序的calling convention应该与静态库或者动态库的calling convention一致(_cdcel,_stdcall等)。
  • 一般导出dll的.h文件可以写成如下,以便可以在dll和调用dll的application中同时使用(通过定义宏
    EXPORTING_DLL来区别)。
#ifdef EXPORTING_DLL 
extern __declspec(dllexport) int mySum(int x, int y); 
#else 
extern __declspec(dllimport) int mySum(int x, int y); 
#endif
 
 

转载于:https://www.cnblogs.com/chuwachen/archive/2011/09/20/3911080.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值