静态链接库LIB和动态链接库DLL.docxVIP

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
静态链接库LIB和动态链接库DLL

静态链接库LIB和动态链接库DLLVS2008 lib静态链接一、静态链接库与动态链接库区别???? 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。?动态库就是在需要调用其中的函数时,根据函数映射表找到该函数然后调入堆栈执行。如果在当前工程中有多处对dll文件中同一个函数的调用,那么执行时,这个函数只会留下一份拷贝。但是如果有多处对lib文件中同一个函数的调用,那么执行时,该函数将在当前程序的执行空间里留下多份拷贝,而且是一处调用就产生一份拷贝。?静态链接库与静态链接库调用规则总体比较如下:1、静态链接库(比较简单):首先,静态链接库的使用需要库的开发者提供生成库的.h头文件和.lib文件。生成库的.h头文件中的声明格式如下:??? extern C 函数返回类型函数名(参数表);??? 在调用程序的.cpp源代码文件中如下:??? #include ..\lib.h??? #pragmacomment(lib,..\\debug\\libTest.lib) //指定与静态库一起链接(或者在IDE的lib栏中填入lib文件的路径,在IDE的lib目录栏填入lib所在文件夹目录)其次因为静态链接库是将全部指令都包含入调用程序生成的EXE文件中。因此如果用的是静态链接库,那么也就不存在“导出某个函数提供给用户使用”的情况,要想用就得全要!要不就都别要!个人理解:其实可以认为静态链接看做与直接将要链入的lib工程的源码引入编译等效,因为实际结果来看也应该是等效的,最终都只是一个exe文件,功能会是完全一样的,只是多了一些编译链接的过程.2、动态链接库:动态链接库的使用需要库的开发者提供生成的.lib文件和.dll文件。或者只提供dll文件。??? 首先我们必须先注意到DLL内的函数分为两种:??? 1)导出函数,可供应用程序调用;??? 2) DLL内部函数,只能在 DLL 程序使用,应用程序无法调用它们。因此调用程序若想调用DLL中的某个函数就要以某种形式或方式指明它到底想调用哪一个函数。??? ? 对于DLL的导出,可以采用如下方法:??????? #ifdef WLL_EXPORTS??????? #define WLL_API __declspec(dllexport)??????? #else??????? #define WLL_API __declspec(dllimport)??????? #endif??? 这是导出类的宏定义,将导出类必须加上该宏,才能被导出。此处的WLL_EXPORTS会出现在 project setting C++ PreProcessor的PreProcessor definition中,这个MACRO表明其要定义一个导出宏。当前库编译时,加了WLL_API的类将被导出,而包含该头文件的其他调用DLL或EXE,由于没有定义WLL_API宏,将申明为导入该类。? 动态库函数的调用,可以采用静态链接的方式?,主要步骤如下:1) 包含DLL中导出的头文件。2) 采用#pragma comment(lib,..\\debug\\libTest.lib)导入动态库生成的*.lib头文件。或在projectàsettingsàLinkeràInput的Additional Dependencies中加入lib文件。3) 将动态库生成的*.dll文件放到EXE或DLL的同一目录下。? 也可以采用动态加载的方式调用?,步骤如下:Another.dll有一个int Add(intx,int y) 函数。则完整的调用过程如下:typedefint (* FunPtr)(int,int); //定义函数指针FunPtrfunPtr;Handle handle =LoadLibrary(Another.dll);funPtr =(FunPtr)GetProcAddress(handle ,Add);funPtr(2,3); // 2+3;FreeLibrary(handle); // 释放载入的动态库二、 LIB文件目前以lib后缀的库有两种,一种为静态链接库?(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库?(Import Libary,以下简称“导入库”)。静态库是一个或者

文档评论(0)

wuyoujun92 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档